先统计各个岛屿的面积,用哈希表存储岛屿编号以及它们各自的面积,最后再从海洋中挑选某一块尝试填充并累加上下左右的不同编号的岛屿的面积,遍历求解最大值就行了
这里唯一需要注意的是如果全是陆地那么要额外引入一个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;
}
};