难度中等739收藏分享切换为英文关注反馈
给你一个由 '1'
(陆地)和 '0'
(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
示例 1:
输入: [ ['1','1','1','1','0'], ['1','1','0','1','0'], ['1','1','0','0','0'], ['0','0','0','0','0'] ] 输出: 1
示例 2:
输入: [ ['1','1','0','0','0'], ['1','1','0','0','0'], ['0','0','1','0','0'], ['0','0','0','1','1'] ] 输出: 3 解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。
BFS
class Solution {
private:
int direct[4][2] =
{
{0,1},
{0,-1},
{1,0},
{-1,0}
};
vector<vector<bool>> visited;
int n, m;
public:
int numIslands(vector<vector<char>>& grid) {
n = grid.size();
if(n==0) return 0;
m = grid[0].size();
visited = vector<vector<bool>>(n, vector<bool>(m, false));
int ans = 0;
for (int i =0; i<n;i++)
{
for(int j =0;j<m;j++)
{
if (grid[i][j] == '1' && !visited[i][j]) // 是小岛
{
visited[i][j] = true;
// bfs逻辑
queue<pair<int,int>>q;
q.push({i,j});
while(!q.empty())
{
int x = q.front().first;
int y = q.front().second;
q.pop();
for(int k = 0;k<4;k++)
{
int newX = x+direct[k][0];
int newY = y + direct[k][1];
if(inArea(newX,newY) && !visited[newX][newY] && grid[newX][newY]=='1')
{
q.push({newX,newY});
visited[newX][newY] = true;
}
}
}
ans++; // 岛屿数量
}
}
}
return ans;
}
bool inArea(int x,int y)
{
return x>=0 && x<n && y>=0 &&y <m;
}
};
DFS
class Solution {
private:
int direct[4][2] =
{
{0,1},
{0,-1},
{1,0},
{-1,0}
};
vector<vector<bool>> visited;
int n, m;
public:
int numIslands(vector<vector<char>>& grid) {
n = grid.size();
if(n==0) return 0;
m = grid[0].size();
visited = vector<vector<bool>>(n, vector<bool>(m, false));
int ans = 0;
for (int i =0; i<n;i++)
{
for(int j =0;j<m;j++)
{
if (grid[i][j] == '1' && !visited[i][j]) // 是小岛
{
int area = dfs(grid,i,j);
ans++; // 岛屿数量
}
}
}
return ans;
}
int dfs(vector<vector<char>> &grid, int x, int y)
{
if(!inArea(x,y) || (inArea(x,y) && visited[x][y]) || grid[x][y] == '0')
return 0;
int area = 1;//
visited[x][y] = true;
for(int i = 0;i<4;i++)
{
int newX = x+ direct[i][0];
int newY = y + direct[i][1];
area += dfs(grid, newX, newY);
}
return area;
}
bool inArea(int x,int y)
{
return x>=0 && x<n && y>=0 &&y <m;
}
};