简述
本文主要分享算法——深度优先遍历。
基本概念
深度优先遍历算法主要用于查找指定目标值。
通过递归等方式进行排查,每次先把一个方向排查到底。
要点及时函数的递归调用。具体看下面的例题
例题
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
}
大致思路类似。
取别在于有个外循环,来遍历到所有岛