方法一(DFS)
实现思路
思路是深度优先搜索+标记法
需要额外开辟一个二维数组book来表明当前元素是否被遍历过,对每一可以构成岛屿遍历的结果使用flag来标记,不同的岛屿使用不同得到flag来标记,由于我设置flag是从-1然后依次递减的,所以最后的结果实际上就是flag数值的绝对值
遍历整个原始的二维数组,每到一个点判断是否为土地且没有被划分到一个岛屿中,如果该土地没有被划分到一个土地中,就以该土地为起点作为一个新的岛屿来找其相邻的岛屿土地
实现代码
class Solution {
private:
int dx[4]={
0,0,-1,1};
int dy[4]={
1,-1,0,0};
int row,column;
public:
bool is_in(int x,int y){
return x>=0&&x<row&&y>=0&&y<column;
}
void dfs(vector<vector<char>>& grid,vector<vector<int>>& book,int x,int y,int flag){
book[x][y]=flag;
for(int i=0;i<4;i++){
int tx=x+dx[i];
int ty=y+dy[i];
if(is_in(tx,ty)&&book[tx][ty]==0&&grid[tx][ty]=='1'){
dfs(grid,book,tx,ty,flag);
}
}
}
int numIslands(vector<vector<char>>& grid) {
int flag=0;
if(grid.size()==0||(grid.size()>0&&grid[0].size()==0)) return 0;
row=grid.size();
column=grid[0].size();
vector<vector<int>> book(row,vector<int>(column,0));
for(int i=0;i<row;i++){
for(int j=0;j<column;j++){
if(book[i][j]==0&&grid[i][j]=='1')
{
flag--;
dfs(grid,book,i,j,flag);
}
}
}
return -flag;
}
};
提交结果及分析
时间复杂度O(n*m)
方法二(BFS)
实现思路
# 实现代码
总结
DFS的算法依赖于递归
BFS的算法依赖于队列
不需要回溯和求最短路有层级的情况下,深搜和宽搜是一样的