(LeetCode 面试经典 150 题) 200. 岛屿数量(深度优先搜索dfs || 广度优先搜索bfs)

题目:200. 岛屿数量


思路:bfs+dfs,两种解法。C++版本是bfs版本,JAVA和GO是dfs版本。

C++版本:

cpp 复制代码
class Solution {
public:
    typedef pair<int,int> PII;
    int fx[4]={-1,1,0,0};
    int fy[4]={0,0,-1,1};
    void dfs(int X,int Y,vector<vector<char>>& grid,vector<vector<bool>> &sta,int n,int m){
        queue<PII> qu;
        qu.push({X,Y});
        sta[X][Y]=true;
        while(qu.size()){
            PII tmp=qu.front();
            qu.pop();
            int x=tmp.first,y=tmp.second;
            for(int i=0;i<4;i++){
                int xx=x+fx[i];
                int yy=y+fy[i];
                if(xx<0||yy<0||xx>=n||yy>=m){
                    continue;
                }
                if(sta[xx][yy]==true||grid[xx][yy]=='0'){
                    continue;
                }
                sta[xx][yy]=true;
                qu.push({xx,yy});
            }
        }
        return ;
        
    }
    int numIslands(vector<vector<char>>& grid) {
        int ans=0;
        int n=grid.size(),m=grid[0].size();
        vector<vector<bool>> sta(n,vector<bool>(m,false));
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(sta[i][j]==false && grid[i][j]=='1'){
                    dfs(i,j,grid,sta,n,m);
                    ans++;
                }
            }
        }
        return ans;
    }

};

JAVA版本:

java 复制代码
class Solution {
    void dfs(int x,int y,char[][] grid){
        if(x<0||y<0||x>=grid.length||y>=grid[0].length) return;
        if(grid[x][y]!='1') return;
        grid[x][y]='2';
        dfs(x-1,y,grid);
        dfs(x,y-1,grid);
        dfs(x,y+1,grid);
        dfs(x+1,y,grid);
    }
    public int numIslands(char[][] grid) {
        int ans=0;
        int n=grid.length,m=grid[0].length;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(grid[i][j]=='1'){
                    dfs(i,j,grid);
                    ans++;
                }
            }
        }
        return ans;
    }
}

GO版本:

go 复制代码
func numIslands(grid [][]byte) int {
    n,m:=len(grid),len(grid[0])
    ans:=0
    for i:=0;i<n;i++ {
        for j:=0;j<m;j++ {
            if grid[i][j]=='1' {
                dfs(i,j,&grid)
                ans++
            }
        }
    }
    return ans
}
func dfs(x,y int,grid * [][]byte) {
    if x<0||y<0||x>=len((*grid))||y>=len((*grid)[0]) {
        return
    }
    if (*grid)[x][y]!='1' {
        return
    }
    (*grid)[x][y]='2'
    dfs(x-1,y,grid)
    dfs(x+1,y,grid)
    dfs(x,y-1,grid)
    dfs(x,y+1,grid)
    
}
相关推荐
FQNmxDG4S3 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
穿条秋裤到处跑3 小时前
每日一道leetcode(2026.04.29):二维网格图中探测环
算法·leetcode·职场和发展
虹科网络安全3 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje4 小时前
Java语法进阶
java·开发语言·jvm
汉克老师4 小时前
GESP2025年3月认证C++五级( 第三部分编程题(1、平均分配))
c++·算法·贪心算法·排序·gesp5级·gesp五级
rKWP8gKv74 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫4 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287924 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本4 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
yaoxin5211235 小时前
397. Java 文件操作基础 - 创建常规文件与临时文件
java·开发语言·python