岛屿的最大面积
https://leetcode-cn.com/problems/max-area-of-island/
给定一个包含了一些 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
。
示例 2:
[[0,0,0,0,0,0,0,0]]
对于上面这个给定的矩阵, 返回 0
。
注意: 给定的矩阵grid
的长度和宽度都不超过 50。
DFS + 剪枝
class Solution { public: int move_[4][2] = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}}; bool map_[55][55]; int dfs(int x, int y, int spuare, int row, int col, vector<vector<int>>& grid){ for(int i = 0; i<4; i++){ int x_ = x+move_[i][0]; int y_ = y+move_[i][1]; if(x_>=0 && y_>=0 && y_<col && x_<row && !map_[x_][y_] && grid[x_][y_]){ map_[x_][y_] = 1; spuare = max(spuare, dfs(x_, y_, spuare+1, row, col, grid)); } } return spuare; } int maxAreaOfIsland(vector<vector<int>>& grid) { int rows = grid.size(); int cols = grid[0].size(); int ans = 0; for(int i = 0; i<rows; i++){ for(int j = 0; j<cols; j++){ if(!map_[i][j] && grid[i][j]){ map_[i][j] = 1; ans = max(ans, dfs(i, j, 1, rows, cols, grid)); } } } return ans; } };