标签:深度遍历 close max check nbsp onclick solution 时间复杂度 grid
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 }
本题的解法在于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 };
标签:深度遍历 close max check nbsp onclick solution 时间复杂度 grid
原文地址:https://www.cnblogs.com/nxnslc-blog/p/12501158.html