首页 > 其他分享 >【DFS&并查集】岛屿数量

【DFS&并查集】岛屿数量

时间:2023-02-18 13:02:09浏览次数:30  
标签:return parent int 查集 岛屿 DFS ++ grid find


【DFS&并查集】岛屿数量_并查集


经典的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();
}
};


标签:return,parent,int,查集,岛屿,DFS,++,grid,find
From: https://blog.51cto.com/BugMaker/6065400

相关文章

  • 淹没岛屿
    5..#####...#.#.......#####40#include<bits/stdc++.h>usingnamespacestd;boolflag;chara[1010][1010];intcnt=0,ans=0,rans=0;intn;intdx[4]={1,-1,0......
  • 经典算法之深度优先搜索(DFS)
    一、前言本文介绍了经典搜索算法:深度优先搜索(DFS)两个小故事:岳云鹏的相声:孙越的爸爸带他参观家里面的聚宝盆,走到了一个密室门前,密室的门上上了一把锁,孙越的爸爸身上带......
  • HDFS优化方案
    一、短路本地读取(ShortCircuitLocalReads)1.1 背景在HDFS中,不管是LocalReads(DFSClient和Datanode在同一个节点)还是RemoteReads(DFSClient和Datanode不在同......
  • HDFS数据(跨集群)迁移
    一、数据迁移使用场景1.冷热集群数据同步、分类存储2.整体数据整体搬迁3.数据准实时同步(备份)二、考量因素1.网络传输带宽及时间,是否会影响现有业务2.性能,单机?多......
  • HDFS读写数据流程
    文件写入(1)HDFSClient上传文件到集群,HDFSClient会创建本地的分布式文件系统(DistributedFileSystem),向集群NameNode请求上传文件(2)NameNode检查目录树是否允许创建文件,检查......
  • 蓝桥杯备战日志(Python)16-玩具蛇&序列个数-(DFS&枚举、递归)
    玩具蛇原题小蓝有一条玩具蛇,一共有16节,上面标着数字1至16。每一节都是一个正方形的形状。相邻的两节可以成直线或者成90度角。小蓝还有一个4×4的方格盒子,用于存放......
  • HDFS文件块
    知识点补充HDFS优缺点:优点(1)高容错性。节点存放的副本比较多。(2)适合处理大数据。GB、TB、PB级别的数据都可以处理。(3)可以构建在廉价的机器上,通过多副......
  • hdfs操作——hdfs的shell命令和hdfs的JavaAPI操作
    hdfs解决hadoop海量数据的存储。shell命令(所有hadoopfs可由hdfsdfs代替)(1)在hdfs上创建目录hadoopfs-mkdir目录名(2)本地文件的上传hadoopfs-copyFromLoc......
  • 深度优先搜索算法-dfs讲解
    迷宫问题有一个迷宫:S**.....***T(其中字符S表示起点,字符T表示终点,字符*表示墙壁,字符.表示平地。你需要从S出发走到T,每次只能向上下左右相邻的位置移动,不能走出地图,也......
  • 分考场 【 DFS + 染色问题 】
    试题历届试题分考场资源限制时间限制:1.0s 内存限制:256.0MB问题描述n个人参加某项特殊考试。为了公平,要求任何两个认识的人不能分在同一个考场。求是少需......