827. 最大人工岛

在二维地图上, 0代表海洋, 1代表陆地,我们最多只能将一格 0 海洋变成 1变成陆地。

进行填海之后,地图上最大的岛屿面积是多少?(上、下、左、右四个方向相连的 1 可形成岛屿)

示例 1:

输入: [[1, 0], [0, 1]]
输出: 3
解释: 将一格0变成1,最终连通两个小岛得到面积为 3 的岛屿。
示例 2:

输入: [[1, 1], [1, 0]]
输出: 4
解释: 将一格0变成1,岛屿的面积扩大为 4。
示例 3:

输入: [[1, 1], [1, 1]]
输出: 4
解释: 没有0可以让我们变成1,面积依然为 4。

class Solution {
public:
    int index = 2;
    int row = 0;
    int col = 0;
    map<int,int> area_memory;
    //将每个连通域用index填充,并将其面积返回
    int area(vector<vector<int>>& grid,int i,int j,int index){
        if(!isgrid(i,j)||grid[i][j]!=1) return 0; 
        grid[i][j] = index;
        //左,下,右,上
        return 1+area(grid,i-1,j,index)+area(grid,i,j+1,index)+area(grid,i+1,j,index)+area(grid,i,j-1,index);
    }
    //判断是否在图内
    bool isgrid(int i,int j){
        if(i>=0&&i<row&&j>=0&&j<col) 
            return true;
        return false;
    }
    int largestIsland(vector<vector<int>>& grid) {
        int res = 0;
        row = grid.size();
        if(!row) return 0;
        col = grid[0].size();
        //将陆地用index填充
        for(int i = 0;i<row;i++)
          for(int j = 0;j<col;j++){
              if(grid[i][j]==1){
                 int count = area(grid,i,j,index);
                 area_memory[index++] = count; //<index,面积>
                 res = max(res, count);//记录最大面积
              }
          }
        //如果没有陆地,直接返回
       if(res==0) return 1;
       //遍历海洋
       for(int i = 0;i<row;i++)
          for(int j = 0;j<col;j++){
              if(grid[i][j]==0){
                  int temp = 0;
                  set<int> s;
                  neighbor(grid,s,i,j);
                  for(int idx:s){
                      temp += area_memory[idx];
                  }
                  res = max(res,temp+1);
              }
          }
        return res;
    }
    //返回海洋的四邻居到set中
    void neighbor(vector<vector<int>>& grid,set<int> &s,int i ,int j){
        if(isgrid(i-1,j)&&grid[i-1][j]!=0) s.insert(grid[i-1][j]); 
        if(isgrid(i,j+1)&&grid[i][j+1]!=0) s.insert(grid[i][j+1]);
        if(isgrid(i+1,j)&&grid[i+1][j]!=0) s.insert(grid[i+1][j]); 
        if(isgrid(i,j-1)&&grid[i][j-1]!=0) s.insert(grid[i][j-1]); 
    }
};
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值