200. Number of Islands
1.dfs
cpp
class Solution {
private:
void dfs(vector<vector<char>>& grid, int i, int j){
int m = grid.size(), n = grid[0].size();
if(i<0 || j<0 || i>=m || j>=n) return;
if(grid[i][j] == '0') return;
grid[i][j] = '0';
dfs(grid, i-1,j);
dfs(grid, i+1, j);
dfs(grid, i, j-1);
dfs(grid, i, j+1);
}
public:
int numIslands(vector<vector<char>>& grid) {
int res = 0;
int m = grid.size(), n = grid[0].size();
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
if(grid[i][j] == '1'){
res++;
dfs(grid, i, j);
}
}
}
return res;
}
};
这里把岛屿淹类似于维护了visited, 确保不会重复计算岛屿,dfs的作用是把一整块岛屿都淹没了,当遍历到岛屿的其中一块时, 会向外淹没,直到这个岛屿都被淹没
1254. Number of Closed Islands
cpp
class Solution {
private:
void dfs(vector<vector<int>>& grid, int i, int j){
int m = grid.size(), n = grid[0].size();
if(i<0 || j<0 || i>=m || j>=n) return;
if(grid[i][j] == 1) return;
grid[i][j] = 1;
dfs(grid, i-1, j);
dfs(grid, i+1, j);
dfs(grid, i, j-1);
dfs(grid, i, j+1);
}
public:
int closedIsland(vector<vector<int>>& grid) {
int res = 0;
int m = grid.size(), n = grid[0].size();
for(int i=0; i<m; i++){
dfs(grid, i, 0);
dfs(grid, i, n-1);
}
for(int j=0; j<n; j++){
dfs(grid, 0, j);
dfs(grid, m-1, j);
}
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
if(grid[i][j] == 0){
res++;
dfs(grid, i, j);
}
}
}
return res;
}
};
去除掉四边的岛屿就可以
1020. Number of Enclaves
cpp
class Solution {
private:
void dfs(vector<vector<int>>& grid, int i, int j){
int m = grid.size();
int n = grid[0].size();
if(i<0 || j<0 || i>=m || j>=n) return;
if(grid[i][j] == 0) return;
grid[i][j] = 0;
dfs(grid, i-1, j);
dfs(grid, i+1, j);
dfs(grid, i, j-1);
dfs(grid, i, j+1);
}
public:
int numEnclaves(vector<vector<int>>& grid) {
int move = 0;
int m = grid.size();
int n = grid[0].size();
for(int i=0; i<m; i++){
dfs(grid, i, 0);
dfs(grid, i, n-1);
}
for(int j=0; j<n; j++){
dfs(grid, 0,j);
dfs(grid, m-1, j);
}
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
if(grid[i][j] == 1)
move++;
}
}
return move;
}
};
和上一题很像,这里就不需要把中间的岛屿淹没了,只要求1的数量就可以了
695. Max Area of Island
cpp
class Solution {
private:
int dfs(vector<vector<int>>& grid, int i, int j){
int m = grid.size(), n = grid[0].size();
if(i<0 || j<0 || i>=m || j>=n) return 0;
if(grid[i][j] == 0) return 0;
grid[i][j] = 0;
return dfs(grid, i-1, j) + dfs(grid, i+1, j) + dfs(grid, i, j-1) + dfs(grid, i, j+1) +1;
}
public:
int maxAreaOfIsland(vector<vector<int>>& grid) {
int maxArea = 0;
int m = grid.size(), n = grid[0].size();
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
if(grid[i][j] == 1)
maxArea = max(maxArea, dfs(grid, i, j));
}
}
return maxArea;
}
};
1905. Count Sub Islands
cpp
class Solution {
private:
void dfs(vector<vector<int>>& grid, int i, int j){
int m = grid.size(), n = grid[0].size();
if(i<0 || j<0 || i>=m || j>=n){
return;
}
if(grid[i][j] == 0) return;
grid[i][j] = 0;
dfs(grid, i-1, j);
dfs(grid, i+1, j);
dfs(grid, i, j-1);
dfs(grid, i, j+1);
}
public:
int countSubIslands(vector<vector<int>>& grid1, vector<vector<int>>& grid2) {
int m = grid1.size(), n = grid1[0].size();
int res = 0;
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
if(grid1[i][j] == 0 && grid2[i][j] == 1){
dfs(grid2, i, j);
}
}
}
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
if(grid2[i][j] == 1){
res++;
dfs(grid2, i, j);
}
}
}
return res;
}
};
重要的是想到是什么是子岛屿
694. Number of Distinct Islands
cpp
class Solution {
private:
void dfs(vector<vector<int>>& grid, int i, int j, string& s, int dir){
int m = grid.size(), n = grid[0].size();
if(i<0 || j<0 || i>=m || j>=n) return;
if(grid[i][j] == 0) return;
grid[i][j] = 0;
s += to_string(dir) + ',';
dfs(grid, i-1, j, s, 1);
dfs(grid, i+1, j, s, 2);
dfs(grid, i, j-1, s, 3);
dfs(grid, i, j+1, s, 4);
s += to_string(-dir) + ',';
}
public:
int numDistinctIslands(vector<vector<int>>& grid) {
unordered_set<string> record;
int m = grid.size(), n = grid[0].size();
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
if(grid[i][j] == 1){
string curIsland = "";
dfs(grid, i, j, curIsland, 666);
record.insert(curIsland);
}
}
}
return record.size();
}
};
需要用一个set记录岛屿的形状
这里也要记录撤销的值