【DFS并查集】岛屿数量

news/2024/7/20 22:02:56 标签: 深度优先, 算法, leetcode

在这里插入图片描述
经典的dfs/bfs问题,给一个起点开始搜索,满足条件则继续调用dfs/bfs

从没有访问过的某个陆地出发,将所有能到达的陆地的状态都记录为已访问。下次出发不从已访问的陆地出发,每次出发前都把岛屿数 + 1即可

class Solution {
public:
    vector<vector<bool>> is_visited;
    const vector<pair<int, int>> direction = {{1, 0}, {0, -1}, {-1, 0}, {0, 1}};
    int m_;
    int n_;

    bool is_valid(int x, int y){
        return x >= 0 && x < m_ && y >= 0 && y < n_;
    }

    void dfs(const vector<vector<char>>& grid, int i, int j) {
        is_visited[i][j] = true;
        for (auto d : direction) {
            int x = i + d.first;
            int y = j + d.second;
            if (is_valid(x, y) && !is_visited[x][y] && grid[x][y] == '1') {
                dfs(grid, x, y);
            }
        }
    }

    int numIslands(vector<vector<char>>& grid) {
        m_ = grid.size();
        n_ = grid[0].size();
        is_visited.resize(m_, vector<bool>(n_, false));
        int ans = 0;
        for(int i = 0; i < m_; i++){
            for(int j = 0; j < n_; j++){
                if(!is_visited[i][j] && grid[i][j] == '1'){
                    dfs(grid, i, j);
                    ans++;
                }
            }
        }
        return ans;
    }
};

遍历二维数组,合并不同的坐标时,在每个陆地坐标处查看自己右侧和下方的位置是否是陆地,如果是,合并当前陆地和自己右侧或下方的陆地

遍历完成后,并查集构造完成,直接获取并查集的集合数即可

class UnionFind{
    public:
        UnionFind(const vector<vector<char>>& grid){
            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') parent[i * n_ + j] = i * n_ + j;
                }
            }
        }

        int find_root(int x){
            // x不存在于并查集
            if(parent.find(x) == parent.end()) return -1;
            if(x == parent[x]) return x;
            parent[x] = find_root(parent[x]);
            return parent[x];
        }

        void merge(int x, int y){
            x = find_root(x);
            y = find_root(y);
            if(x != y) parent[x] = y;
        }

        int get_find_num() {
            unordered_set<int> st;
            // 遍历并查集,得到集合数量
            for (auto iter = parent.begin(); iter != parent.end(); iter++) {
                st.insert(find_root((*iter).first));
            }
            return st.size();
        }

    private:
        unordered_map<int, int> parent;  // 并查集
        int m_;
        int n_;
};

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        UnionFind uf(grid);
        int m = grid.size();
        int n = grid[0].size();
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                // 如果自己右边或者下面是陆地,则合并集合
                if(grid[i][j] == '0') continue;
                if(i < m - 1){
                    // 可以查看下方
                    if(grid[i + 1][j] == '1') uf.merge(i * n + j, (i + 1) * n + j);
                }
                if(j < n - 1){
                    // 可以查看右边
                    if(grid[i][j + 1] == '1') uf.merge(i * n + j, i * n + (j + 1));
                }
            }
        }
        return uf.get_find_num();
    }
};

http://www.niftyadmin.cn/n/56038.html

相关文章

牛客网Python篇数据分析习题(一)

1.现有一个Nowcoder.csv文件&#xff0c;它记录了牛客网的部分用户数据&#xff0c;包含如下字段&#xff08;字段与字段之间以逗号间隔&#xff09;&#xff1a; Nowcoder_ID&#xff1a;用户ID Level&#xff1a;等级 Achievement_value&#xff1a;成就值 Num_of_exercise&a…

有趣的KaTeX(附源码)

两年半未见&#xff0c;甚是想念 给大家带来有趣的KaTeX\KaTeXKATE​X&#xff0c;可以放在洛谷主页 文章目录1234561 1#include<bits/stdc.h>\texttt{1 \color{orange}\#include <bits/stdc.h>}1 #include <bits/stdc.h> 2usingnamespacestd;\texttt{2 \col…

空间中任意一点到球的截面的最短距离

假设球的球心坐标为Oball{x0,y0,z0}O_{ball}\{x_0,y_0,z_0\}Oball​{x0​,y0​,z0​}&#xff0c;球的半径为rrr&#xff0c;球的方程为(x−x0)2(y−y0)2(z−z0)2r2(x-x_0)^2(y-y_0)^2(z-z_0)^2r^2(x−x0​)2(y−y0​)2(z−z0​)2r2球的一截面的方程为AxByCz10AxByCz10AxByCz10…

亿级高并发电商项目-- 实战篇 --万达商城项目 二(Zookeeper、Docker、Dubbo-Admin等搭建工作

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小童&#xff0c;Java开发工程师&#xff0c;CSDN博客博主&#xff0c;Java领域新星创作者 &#x1f4d5;系列专栏&#xff1a;前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶 &#x1f4…

实验7-变治技术及动态规划初步

目录 1.统计个数 2.数塔dp -A 3.Horspool算法 4.计数排序 5.找零问题1-最少硬币 1.统计个数 【问题描述】有n个数、每个元素取值在1到9之间,试统计每个数的个数 【输入形式】第一行,n的值;第二行࿰

JavaScript HTML DOM

HTML DOM&#xff08;文档对象模型&#xff09;是一种把 HTML 文档视为对象的技术&#xff0c;可以使用 JavaScript 访问和操作 HTML 页面中的元素。 HTML DOM 定义了一组对象&#xff0c;可以用来表示 HTML 页面中的元素&#xff0c;如文本框、按钮、图像等等。每个 HTML 元素…

低噪声与功放选型购买

低噪声与功率放大器的区别&#xff1f;购买时怎么区分&#xff1f; 低噪放 低噪放&#xff0c;低噪声射频放大器。作用就是要求噪声系数很低&#xff0c;放大电压信号。一般放在系统第一级&#xff0c;因为噪声系数低&#xff0c;接收放大的信号有很好的的信噪比。如天线的接…

6年自动化测试,终于进华为了,年薪25w其实也并非触不可及

我的职业生涯开始和大多数测试人一样&#xff0c;开始接触都是纯功能界面测试&#xff0c;第一份测试工作就是在电商公司做功能测试&#xff0c;工作忙忙碌碌&#xff0c;每天在各种业务需求学习和点点中度过&#xff0c;过了好几年发现自己还只是一个功能测试工程师&#xff0…