搜索算法------深度优先搜索
1. 介绍
深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树或图的算法。这种算法通过尽可能深地搜索图的分支来探索解决方案空间,直到达到一个没有分支的点,然后回溯
1.1 原理
- 选择起始点:从图中的某个顶点开始
- 探索分支:沿着一条路径尽可能深地探索,直到到达一个没有未探索邻接点的顶点
- 回溯:当无法进一步深入时,回溯到上一个顶点,探索其他未探索的分支
- 重复:重复上述过程,直到所有顶点都被访问过
比如下图是一颗简单的树:
首先我们从1开始,沿着最左边的路径探索,于是首先找到了2这个节点,然后再深入,找到了3,3后面没有节点了,于是回溯到2,再向右找到了4,4后面没有节点,再回溯到2,2的节点都已探索结束,于是返回1,由1开始继续向右探索,找到了6,然后从6开始找到了7,7后面没有节点,回溯到6,6后面也没有节点,回溯到1,1也没有其他节点,于是探索结束。所以这颗树的深度优先搜索结果就为123467.
2. 题目
3. 思路和题解
这道题其实就可以用DFS来求解,当我们对这个二维数组进行遍历时,对于每一块土地,就是通过上面所描述的原理,去尽可能深的寻找前后左右有土地的地方,如果没有土地了,则进行回溯,以此类推,直到寻找结束。
当我们在寻找的时候,如果这块土地已经找过了,为了避免重复计算,我们将其置为0,然后最后取所有岛屿的最大值即可。
代码如下:
class Solution {
public int maxAreaOfIsland(int[][] grid) {
if (grid == null || grid.length == 0) {
return 0;
}
int nr = grid.length;
int nc = grid[0].length;
int ans = 0 ;
for(int r = 0; r < nr;r++){
for(int c = 0;c < nc;c++){
if(grid[r][c] == 1){
ans = Math.max(ans,dfs(grid,r,c));
}
}
}
return ans;
}
public int dfs(int[][] grid,int r,int c){
int nr = grid.length;
int nc = grid[0].length;
int ans = 0;
if(r < 0 || c < 0 || r >= nr || c >= nc || grid[r][c] == 0){
return 0;
}
grid[r][c] = 0;
ans++;
ans = ans +dfs(grid,r-1,c);
ans = ans +dfs(grid,r+1,c);
ans = ans +dfs(grid,r,c-1);
ans = ans +dfs(grid,r,c+1);
return ans;
}
}