【Leetcode 695】【Leetcode733】【GO】深度优先遍历 DFS

简述

本文主要分享算法——深度优先遍历。

基本概念

深度优先遍历算法主要用于查找指定目标值。
通过递归等方式进行排查,每次先把一个方向排查到底。
要点及时函数的递归调用。具体看下面的例题

例题

Leetcode733 图像渲染

题目

有一幅以 m x n 的二维整数数组表示的图画 image ,其中 image[i][j] 表示该图画的像素值大小。

你也被给予三个整数 sr , sc 和 newColor 。你应该从像素 image[sr][sc] 开始对图像进行 上色填充 。

为了完成 上色工作 ,从初始像素开始,记录初始坐标的 上下左右四个方向上 像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应 四个方向上 像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为 newColor 。

最后返回 经过上色渲染后的图像 。

解析

func floodFill(image [][]int, sr int, sc int, color int) [][]int {
    mr := len(image)
    if mr <= 0 {
        return image
    }
    mc := len(image[0])
    if image[sr][sc] == color {
        return image
    }

    return DFS(image, sr, sc, color, image[sr][sc], mr, mc)
}

func DFS(image [][]int, sr int, sc int, color int, tar int, mr, mc int) [][]int {
    if sr < 0 || sc < 0 || sr >= mr || sc >= mc {
        return image
    }
    if image[sr][sc] != tar {
        return image
    }
    image[sr][sc] = color
    DFS(image, sr+1, sc, color, tar, mr, mc)
    DFS(image, sr-1, sc, color, tar, mr, mc)
    DFS(image, sr, sc+1, color, tar, mr, mc)
    DFS(image, sr, sc-1, color, tar, mr, mc)
    return image
}

解题思路就是从开始值开始,往上下左右循环遍历,得到目标值。
一个要点就是要注意退出逻辑。即确定啥情况要直接返回,
另一个是,确定符合预期后要先修改值,防止重复计算

Leetcode 685

题目:

给你一个大小为 m x n 的二进制矩阵 grid 。

岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。

岛屿的面积是岛上值为 1 的单元格的数目。

计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。

解析

var (
    dx = []int{1, 0, -1, 0}
    dy = []int{0, 1, 0, -1}
)

func maxAreaOfIsland(grid [][]int) int {
    lenL := len(grid)
    if lenL <= 0 {
        return 0
    }
    lenR := len(grid[0])
    max := int(0)
    var tmp int
    for l := 0 ;l < lenL ; l++ {
        for r:=0;r<lenR;r++ {
            if grid[l][r] == 1 {
                tmp = DFS(grid, l, r, lenL, lenR)
                if tmp >= max {
                    max = tmp
                }
            }
        }
    }
    return max
}

func DFS(grid [][]int, x, y, mL, mR int) int {
    if x<0 || y<0 || x>=mL || y>=mR || grid[x][y] != 1 {
        return 0
    }
    grid[x][y] = 2
    tar := 1
    for idx:=0;idx<4;idx++ {
        tar += DFS(grid, x+dx[idx],y+dy[idx],mL,mR)
    }
    return tar
}

大致思路类似。
取别在于有个外循环,来遍历到所有岛

你可能感兴趣的:(深度优先,leetcode,算法)