在二维地图上, 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]);
}
};