LeetCode200

本文介绍了一种使用并查集解决二维网格中岛屿数量计算问题的方法。通过将相邻的陆地进行连接,最终统计独立岛屿的数量。文章提供了一个详细的C++实现案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。

示例 1:

输入:
11110
11010
11000
00000

输出: 1

示例 2:

输入:
11000
11000
00100
00011

输出: 3

 

并查集的问题,额,我也是开始学习,所以看了别人的

#include<iostream>
#include<vector>
#include<unordered_map>

using namespace std;

class Solution {
public:
	vector<int> UN;

	//并查集  查找根节点
	int find(int x){
		if(x!=UN[x]) UN[x]=find(UN[x]);
		return UN[x];
	}
    int numIslands(vector<vector<char>>& grid) {
		int m=grid.size();
		if(m==0) return 0;
		int n=grid[0].size();

		for(int i=0 ; i<m*n ; i++)
			UN.push_back(i);

		for(int i=0 ; i<m ; i++){
			for(int j=0 ; j<n ; j++){
				int x=i*n+j;
				if(grid[i][j]=='0')
				{
					UN[x]=-1;
					continue;
				}

				if(i!=0 && grid[i-1][j]=='1'){
					int y=(i-1)*n+j;
					UN[find(x)]=find(y);
				}

				if(j!=0 && grid[i][j-1]=='1'){
					int y=i*n+j-1;
					UN[find(x)]=find(y);
				}
			}

		}

		//查找具体连接块的数量
		int res=0;
		unordered_map<int ,int > mp;
		for(int i=0 ; i<m*n ; i++){
			if(UN[i]==-1) continue;
			int y=find(i);
			if(!mp[y]){   //查看当前节点的父节点是否一致,不一致就是不存在
				res++;
				mp[y]=1;
			}

		}
		return res;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值