695-岛屿的最大面积

DFS算法:一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。

DFS算法属于回溯思想(解题模板):

 1 int check(参数)
 2 {
 3     if(满足条件)
 4         return 1;
 5     return 0;
 6 }
 7  
 8 void dfs(int step)
 9 {
10         判断边界
11         {
12             相应操作
13         }
14         尝试每一种可能
15         {
16                满足check条件
17                标记
18                继续下一步dfs(step+1)
19                恢复初始状态(回溯的时候要用到)
20         }
21 }   
View Code

本题的解法在于DFS的时候注意岛屿(二维矩阵)的边不能超过。

同时如果对于访问过的结点不改数,改点仍置为1,可能会出现一直循环的问题

1     1

1     1

所以访问过的点置为非0非1的值即可,综上在采用DFS解法模板就可以解题出来,仔细体会,明天多刷题。

 1 class Solution {
 2 public:
 3     int maxAreaOfIsland(vector<vector<int>>& grid) {
 4         int res = 0;
 5         for(int i = 0; i < grid.size(); i++)
 6         for(int j = 0; j < grid[0].size(); j++)
 7             if(grid[i][j] == 1)       res = max(res,dfs(grid,i,j));         //更新最大面积
 8         return res;
 9     }
10 
11     int dfs(vector<vector<int>>& grid,int i,int j){
12         if( i < 0 || i >= grid.size() || j < 0 || j >= grid[0].size() || grid[i][j] != 1)
13             return 0;
14         grid[i][j] = -1;        //防止重复访问,置为-1
15         return 1 + dfs(grid,i-1,j) + dfs(grid,i+1,j) + dfs(grid,i,j-1) + dfs(grid,i,j+1);           //上下左右
16     }
17     
18 };
View Code

猜你喜欢

转载自www.cnblogs.com/nxnslc-blog/p/12501158.html
今日推荐