描述

给定一个用 n*m 矩阵表示的群岛的地图,其中 1 表示岛屿, 0 表示海洋,每个岛屿的水平或竖直方向相邻的岛屿可以视为连在一起的岛屿,每一块岛屿视为面积为 1 ,请问面积最大的岛屿是多少。

例如:
当输入[[1,0],[0,1]]时,对应的地图为:

只有在水平或竖直方向相邻的岛屿可以连在一起,所以每个岛屿互相独立。最大面积是1

当输入[[1,1],[1,0]]时,对应的地图为:

三块岛屿可以连在一起,最大面积是3

数据范围:1 \le n,m \le 501n,m50

示例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;
    }
};