首先DFS遍历“自然”岛的时候,用一个数字位区分每个岛,具体想法是对每个岛进行编号,dfs的同时把1改为当前岛的编号,同时用一个map记录该编号岛的面积。
进入正式流程
遍历矩阵:
如果遇到0,则查看上下左右:
1、如果遇到1,则进行dfs,编号,计算该岛的面积,加入当前遍历的0的count中;
2、如果遇到非0且非1,从map中取出当前岛编号对应的面积,加入count中;此处需要注意区分遇到的岛,以免重复计算。
3、如果遇到0,continue;
查看当前0的上下左右完事之后,记得 +1;毕竟填完自己之后面积会+1.
如果遇到1:
dfs 编号,计算面积。
代码如下:
class Solution {
public:
void searchLand(unordered_map<int, int> &land_area, int land_count, vector<vector<int>>& grid, int i, int j){
if (i < 0 || i >= grid.size() || j < 0 || j>= grid[0].size()) {
return;
}
if (grid[i][j] == 0) {
return;
} else if(grid[i][j] != 1) {
return;
} else{
grid[i][j] = land_count;
land_area[land_count]++;
searchLand(land_area, land_count, grid, i + 1, j);
searchLand(land_area, land_count, grid, i - 1, j);
searchLand(land_area, land_count, grid, i, j + 1);
searchLand(land_area, land_count, grid, i, j - 1);
}
}
int largestIsland(vector<vector<int>>& grid)
{
if(grid.empty()) return 0;
unordered_map<int, int> land_area;
int land_count = 2;
int max = 0;
for (int i = 0; i < grid.size(); i++) {
for(int j = 0;j < grid[0].size(); j++) {
if(grid[i][j] == 0){
int cur_count = 0;
set<int> cur_land;
if(i - 1 >= 0 && grid[i-1][j] != 0) {
if(grid[i-1][j] == 1) {
searchLand(land_area, land_count, grid, i-1, j);
cur_count += land_area[land_count];
cur_land.insert(land_count);
land_count++;
} else{
if(cur_land.find(grid[i-1][j]) == cur_land.end()){
cur_count += land_area[grid[i-1][j]];
cur_land.insert(grid[i-1][j]);
}
}
}
if(i + 1 < grid.size() && grid[i+1][j] != 0) {
if(grid[i+1][j] == 1) {
searchLand(land_area, land_count, grid, i+1, j);
cur_count += land_area[land_count];
cur_land.insert(land_count);
land_count++;
} else{
if(cur_land.find(grid[i+1][j]) == cur_land.end()){
cur_count += land_area[grid[i+1][j]];
cur_land.insert(grid[i+1][j]);
}
}
}
if(j - 1 >= 0 && grid[i][j-1] != 0) {
if(grid[i][j-1] == 1) {
searchLand(land_area, land_count, grid, i, j-1);
cur_count += land_area[land_count];
cur_land.insert(land_count);
land_count++;
} else{
if(cur_land.find(grid[i][j-1]) == cur_land.end()){
cur_count += land_area[grid[i][j-1]];
cur_land.insert(grid[i][j-1]);
}
}
}if(j + 1 < grid[0].size() && grid[i][j+1] != 0) {
if(grid[i][j+1] == 1) {
searchLand(land_area, land_count, grid, i, j+1);
cur_count += land_area[land_count];
cur_land.insert(land_count);
land_count++;
} else{
if(cur_land.find(grid[i][j+1]) == cur_land.end()) {
cur_count += land_area[grid[i][j+1]];
cur_land.insert(grid[i][j+1]);
}
}
}
max = max < cur_count + 1 ? cur_count + 1 : max;
} else if(grid[i][j] == 1) {
searchLand(land_area, land_count, grid, i, j);
land_count++;
}
}
}
if(max == 0 && !land_area.empty()) {
max = grid.size() * grid[0].size();
}
return max;
}
};