岛屿的最大面积

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

 

posted @ 2021-07-17 17:27  会飞的雅蠛蝶  阅读(57)  评论(0编辑  收藏  举报