深度优先遍历2次
第一次将各个岛分类,同一个岛上的格子使用同一种编号,并且得到每个岛屿的大小;
第二次试着将所有海洋都填一遍,找出最大的结果。
class Solution {
vector<vector<int>> dir{{0,1},{0,-1},{1,0},{-1,0}};
public:
int largestIsland(vector<vector<int>>& grid) {
unordered_map<int,int> map;
int m = grid.size(), n = grid[0].size();
int num = 2, sumArea = 0;//num是编号,从2开始
for(int i=0;i<m;++i){
for(int j=0;j<n;++j){
if(grid[i][j]==1){
map[num] = dfs(grid,m,n,i,j,num);
sumArea += map[num++];
}
}
}
if(sumArea == 0){//没有陆地
return 1;
}else if(sumArea == m*n){//全是陆地
return sumArea;
}
int maxRes = 0;
for(int i=0;i<m;++i){
for(int j=0;j<n;++j){
if(grid[i][j]==0){
int temp = 0;
unordered_set<int> visited;
for(auto d:dir){
int x1 = i+d[0], y1 = j+d[1];
if(x1>=0 && y1>=0 && x1<m && y1<n && visited.count(grid[x1][y1])==0){
temp += map[grid[x1][y1]];
visited.insert(grid[x1][y1]);
}
}
maxRes = max(maxRes,temp+1);//+1是填的陆地
}
}
}
return maxRes;
}
int dfs(vector<vector<int>>& grid, int m,int n,int x, int y, int num){
int area = 1;
grid[x][y] = num;
for(auto d:dir){
int x1 = x+d[0], y1 = y+d[1];
if(x1>=0 && y1>=0 && x1<m && y1<n && grid[x1][y1]==1)
area += dfs(grid,m,n,x1,y1,num);
}
return area;
}
};