给定一个包含了一些 0 和 1 的非空二维数组 grid 。
一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。
找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。)
示例 1:
[[0,0,1,0,0,0,0,1,0,0,0,0,0],
[0,0,0,0,0,0,0,1,1,1,0,0,0],
[0,1,1,0,1,0,0,0,0,0,0,0,0],
[0,1,0,0,1,1,0,0,1,0,1,0,0],
[0,1,0,0,1,1,0,0,1,1,1,0,0],
[0,0,0,0,0,0,0,0,0,0,1,0,0],
[0,0,0,0,0,0,0,1,1,1,0,0,0],
[0,0,0,0,0,0,0,1,1,0,0,0,0]]
对于上面这个给定矩阵应返回 6。注意答案不应该是 11 ,因为岛屿只能包含水平或垂直的四个方向的 1 。
DFS模板
广度优先搜索(BFS)一层一层遍历,每一层得到的所有新节点,要用队列存储起来以备下一层遍历的时候再遍历。
而深度优先搜索(DFS)在得到一个新节点时立即对新节点进行遍历
在程序实现 DFS 时需要考虑以下问题:
- 栈:用栈来保存当前节点信息,当遍历新节点返回时能够继续遍历当前节点。可以使用递归栈。
- 标记:和 BFS 一样同样需要对已经遍历过的节点进行标记
class Solution { private: void dfs(vector<vector<int>> &grid, int x, int y, int& sum) { if(x < 0 || y < 0 || x >= grid.size() || y >= grid[0].size() || grid[x][y] != 1) return; //走过的,标记 grid[x][y] = 0; sum++; //上 dfs(grid, x-1, y, sum); //下 dfs(grid, x+1, y, sum); //左 dfs(grid, x, y-1, sum); //右 dfs(grid, x, y+1, sum); } public: int maxAreaOfIsland(vector<vector<int>>& grid) { if(grid.size() == 0) return 0; int row = grid.size(), col = grid[0].size(); int res = 0; for(int i = 0; i < row; i++) { for(int j = 0; j < col; j++) { int cur = 0; dfs(grid, i, j, cur); res = max(res, cur); } } return res; } };