leecode827.最大人工岛

 先统计各个岛屿的面积,用哈希表存储岛屿编号以及它们各自的面积,最后再从海洋中挑选某一块尝试填充并累加上下左右的不同编号的岛屿的面积,遍历求解最大值就行了

这里唯一需要注意的是如果全是陆地那么要额外引入一个isAllIsland布尔变量判断是否是全陆地,如果是直接返回n*n

class Solution {
private:
    int largestIsland(vector<vector<int>>& grid,int x,int y,int mark){
        if(x<0||y<0||x>=grid.size()||y>=grid[0].size())
            return 0;
        else if(grid[x][y]==0||grid[x][y]!=1)
            return 0;
        else{
            grid[x][y]=mark;
            return 1+largestIsland(grid,x,y+1,mark)+largestIsland(grid,x+1,y,mark)+largestIsland(grid,x,y-1,mark)+largestIsland(grid,x-1,y,mark);
        }
    }
public:
    int largestIsland(vector<vector<int>>& grid) {
        int n=grid.size();
        bool isAllIsland=true;
        
        unordered_map<int,int> gridArea;//记录岛屿编号以及他的对应面积
        int mark=2;//岛屿编号
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                if(grid[i][j]==1){
                    gridArea[mark]=largestIsland(grid,i,j,mark);
                    mark++;
                }else if(grid[i][j]==0)
                    isAllIsland=false;

        if(isAllIsland)
            return n*n;
        
        int result=0;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                if(grid[i][j]==0){
                    unordered_set<int> visitedGrid;//标记是否累加过该岛屿
                    int count=1;//自身被填为陆地的面积
                    //累加上四个方向上的不同岛屿的面积
                    if(j+1<n&&visitedGrid.find(grid[i][j+1])==visitedGrid.end()){
                        count+=gridArea[grid[i][j+1]];
                        visitedGrid.insert(grid[i][j+1]);
                    }
                    if(i+1<n&&visitedGrid.find(grid[i+1][j])==visitedGrid.end()){
                        count+=gridArea[grid[i+1][j]];
                        visitedGrid.insert(grid[i+1][j]);
                    }
                    if(j>0&&visitedGrid.find(grid[i][j-1])==visitedGrid.end()){
                        count+=gridArea[grid[i][j-1]];
                        visitedGrid.insert(grid[i][j-1]);
                    }
                    if(i>0&&visitedGrid.find(grid[i-1][j])==visitedGrid.end()){
                        count+=gridArea[grid[i-1][j]];
                        visitedGrid.insert(grid[i-1][j]);
                    }
                    result=max(result,count);
                }
        return result;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值