宽度优先搜索

简介: LeetCode 200两个思路:深度搜索或者并查集。思路一:DFS  依次访问每一个点, 如果是'1'就进行DFS搜索, 访问过的地方可以改变他的值, 防止再次访问.


LeetCode 200


两个思路:深度搜索或者并查集。

思路一:DFS  依次访问每一个点, 如果是'1'就进行DFS搜索, 访问过的地方可以改变他的值, 防止再次访问.

class Solution {
public:
    void DFS(vector<vector<char>>& grid, int i, int j)
    {
        if(i<0||j<0||i>=grid.size()||j>=grid[0].size()||grid[i][j]!='1') return;
        grid[i][j] = '2';
        DFS(grid, i+1, j);
        DFS(grid, i-1, j);
        DFS(grid, i, j+1);
        DFS(grid, i, j-1);
    }
    
    int numIslands(vector<vector<char>>& grid) {
        if(grid.size()==0) return 0;
        int cnt = 0, m = grid.size(), n = grid[0].size();
        for(int i = 0; i < m; i++)
            for(int j =0; j < n; j++)
                if(grid[i][j] == '1')
                {
                    cnt++;
                    DFS(grid, i, j);
                }
        return cnt;
    }
};

思路二:并查集

class Solution {  
public:  
    int find(int k, vector<int>& u){  
        return k == u[k] ? k : u[k] = find(u[k],u);  
    }  
    int numIslands(vector<vector<char>>& grid) {  
        int res = 0;  
        int m = grid.size();  
        if (!m) return 0;  
        int n = grid[0].size();  
        if (!n) return 0;  
        vector<int>us(grid.size()*grid[0].size());  
        //从右下角开始遍历  
        for (int i = m - 1; i >= 0; i--)  
            for (int j = n - 1; j >= 0; j--){  
                if (grid[i][j] != '0'){  
                    int k = i*n + j;  
                    //并查集  
                    int s = i != m - 1 && grid[i+1][j] != '0' ? find(k + n, us) : 0;  
                    int t = j != n - 1 && grid[i][j+1] != '0' ? find(k + 1, us) : 0;  
                    if (s == t){  
                        if (s) us[k] = s;  
                        else { us[k] = k; res++; }  
                    }  
                    else{  
                        if (!s) us[k] = t;  
                        else if (!t) us[k] = s;  
                        else{ us[k] = us[s] = us[t] = max(us[s], us[t]); res--; }  
                    }  
                }  
            }  
        return res;  
    }     
};  

相关文章
|
5月前
|
C++
基于Qt的简易桌面日历设计与实现
基于Qt的简易桌面日历设计与实现
239 1
|
11月前
|
Windows
volatility常用的命令
volatility常用的命令
137 0
|
5月前
|
数据采集 JSON JavaScript
SpringBoot+Vue(二)ES6模块化、SPA-Vue企业级开发和Vue全家桶
SpringBoot+Vue(二)ES6模块化、SPA-Vue企业级开发和Vue全家桶
121 0
SpringBoot+Vue(二)ES6模块化、SPA-Vue企业级开发和Vue全家桶
|
存储 搜索推荐 算法
七大排序 (9000字详解直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序)
七大排序 (9000字详解直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序)
85 0
|
安全 Linux 网络安全
如何使用Nmap进行端口扫描和服务识别?
如何使用Nmap进行端口扫描和服务识别?
781 0
|
人工智能 安全 数据库
沙特电信宣布与阿里云成立合资公司
沙特电信宣布与阿里云成立合资公司
498 0
|
存储 Java 关系型数据库
【技术干货】理解Unicode字符编码
本文对字符编码Unicode以及UTF8和UTF16的编码原理进行了详细说明
655 1
|
监控 算法 API
量化合约交易系统开发方案逻辑丨合约量化程序交易系统开发方案
量化合约交易系统开发方案逻辑丨合约量化程序交易系统开发方案
量化合约交易系统开发方案逻辑丨合约量化程序交易系统开发方案
|
消息中间件 资源调度 Kafka
Flink / Kafka - Recovery is suppressed by FixedDelayRestartBackoffTimeStrategy 排查与修复 ———————————————— 版权声明:本文为CSDN博主「BIT_666」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/BIT_666/article/details/125419738
使用 Flink - Kafka 接数据 Source 时程序报错:org.apache.flink.runtime.JobException: Recovery is suppressed by FixedDelayRestartBackoffTimeStrategy,任务每次启动后持续10min左右,然后 RUNNING -> FAILED,如此重启失败了多次。
3582 0
Flink / Kafka - Recovery is suppressed by FixedDelayRestartBackoffTimeStrategy 排查与修复  ———————————————— 版权声明:本文为CSDN博主「BIT_666」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/BIT_666/article/details/125419738
|
安全 数据挖掘 数据安全/隐私保护
新一代蓝牙5.3到底有哪些新东西
2021年7月,蓝牙官方组织SIG释放了代码Syndney的5.3版本蓝牙核心协议文档,此版本仍在第5个大版本中,属于小功能升级,那这个版本带来了哪些功能升级呢?
新一代蓝牙5.3到底有哪些新东西