dfs题解总结

122 阅读1分钟
  • 在解有关于dfs的题目中,常常会出现相关的一些词汇:dfs | 回溯 | 二叉树 | 全排列。
  • 他们大致都有一个套路模板,大概如下:
大致模板
result = []
func backtrack(路径,选择列表) {
	if 满足结束条件 {
		result.add(路径)
	}
	return

	for 选择 in 选择列表 {
		做选择
		backtrack(路径,选择列表)
		撤销选择
	}
}

例题:

给你一个大小为 m x n 的二进制矩阵 grid 。
岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个
方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。
岛屿的面积是岛上值为 1 的单元格的数目。
计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0

图片.png

class Solution {
  public int maxAreaOfIsland(int[][] grid) {
     int ans = 0;
    for (int i = 0; i < grid.length; i++) {
      for (int j = 0; j < grid[i].length; j++) {
        ans = Math.max(ans, area(grid, i, j));
     }
   }
    return ans;
 }
  private int area(int[][] grid, int i, int j) {
    if (i < 0 || j < 0 || i == grid.length || j == grid[i].length || grid[i]
[j] == 0)
      return 0;
    grid[i][j] = 0;
    return
    area(grid, i - 1, j)
    + area(grid, i + 1, j)
    + area(grid, i, j - 1)
    + area(grid, i, j + 1) + 1;
 }
}