描述
给定一个用 n*m 矩阵表示的群岛的地图,其中 1 表示岛屿, 0 表示海洋,每个岛屿的水平或竖直方向相邻的岛屿可以视为连在一起的岛屿,每一块岛屿视为面积为 1 ,请问面积最大的岛屿是多少。
例如:
当输入[[1,0],[0,1]]时,对应的地图为:
只有在水平或竖直方向相邻的岛屿可以连在一起,所以每个岛屿互相独立。最大面积是1
当输入[[1,1],[1,0]]时,对应的地图为:
三块岛屿可以连在一起,最大面积是3
数据范围:1 \le n,m \le 501≤n,m≤50
示例1
输入:
[[1,0],[0,1]]复制
返回值:
1复制
说明:
如题面解释
示例2
输入:
[[1,1],[1,0]]复制
返回值:
3复制
说明:
如题面解释
解题思路:
本题和计算岛屿个数类似,在找到岛屿后将岛屿淹没,淹没的过程中记录岛屿面积,通过max函数并取得岛屿面积最大值。
class Solution { public: int func(vector<vector<int> >& grid, int x, int y) { int n = grid.size(); int m = grid[0].size(); if (x < 0 || x >= n || y < 0 || y >= m || grid[x][y] == 0) { return 0; } grid[x][y] = 0; int res = 1; res += func(grid, x, y+1); res += func(grid, x, y-1); res += func(grid, x-1, y); res += func(grid, x+1, y); return res; } /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param grid int整型vector<vector<>> * @return int整型 */ int maxAreaIsland(vector<vector<int> >& grid) { // write code here int n = grid.size(); int m = grid[0].size(); int res = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (grid[i][j] == 1) { res = max(res, func(grid, i, j)); } } } return res; } };