【LeetCode200】-岛屿数量

方法一(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的算法依赖于队列

不需要回溯和求最短路有层级的情况下,深搜和宽搜是一样的