leetcode 200岛屿的个数

时间:2019-05-16 16:20:02   收藏:0   阅读:144

 技术分享图片

 

主要考察图搜索:

方法一:染色法,时间O(mn)

遍历一遍,再通过BFS或DFS将所有临近岛屿染色,使用dfs时将numIslands中的bfs换成dfs即可;

/*****
遍历所有的点:
    只要遇见陆地(1),投放1枚原子弹,爆炸冲击波以BFS或DFS的形式向外扩散,使得自身及所有相邻区域全部夷为平地;
最终遍历结束,原子弹使用数目即为岛屿次数
*****/

class Solution {
public:
    vector<vector<int> > dirs={{-1,0},{0,1},{1,0},{0,-1}};
    int numIslands(vector<vector<char>>& grid) {
        int m=grid.size();
        if(m==0) return 0;
        int n=grid[0].size();
        if(n==0) return 0;
        int res=0;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(grid[i][j]==1){
                    res++;bfs(grid,i,j);
                }
            }
        }
        return res;
    }
    void dfs(vector<vector<char>>&grid,int i,int j){
        int m=grid.size(),n=grid[0].size();
        if(i<0 || i>=m ||j<0 ||j>=n||grid[i][j]!=1) return;
        grid[i][j]=0;
        for(auto dir:dirs){
            dfs(grid,i+dir[0],j+dir[1]);
        }
    }
    void bfs(vector<vector<char>>&grid,int i,int j){
        int m=grid.size(),n=grid[0].size();
        queue<pair<int,int>> q;
        pair<int,int> p;
        p.first=i,p.second=j;
        q.push(p);
        while(!q.empty()){
            p=q.front();
            q.pop();
            int a=p.first,b=p.second;
            if(a>=0 && a<m && b>=0 && b<n && grid[a][b]==1){
                grid[a][b]=0;
                for(auto dir:dirs){
                    pair<int,int> tmp;
                    tmp.first=a+dir[0],tmp.second=b+dir[1];
                    q.push(tmp);
                }
            }
        }
    }
};

第二种:并查集的方法,

 

原文:https://www.cnblogs.com/joelwang/p/10875921.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!