LeetCode 省份的数量

题目链接

思路:使用并查集,遍历isConnected数组,将相连的城市对应的集合合并,最后找不重复元素的个数就是省份的数量

class Solution {
    static class UnionSet{
		int[] parent;
		public UnionSet(int length) {
			parent = new int[length];
			for(int i = 0; i < length; i++) {
				parent[i] = i;
			}
		}
		// i的根节点
		int find(int i) {
			int root = i;
			while(parent[root] != root)
				root = parent[root];
			while(parent[i]!=root) {
				int father = parent[i];
				parent[i] = root;
				i = father;
			}
			return root;
		}
		void merge(int i,int j) {
			int root1 = find(i);
			int root2 = find(j);
			if(root1!=root2) {
				parent[root2] = root1;
			}
		}
	}
    public int findCircleNum(int[][] isConnected) {
        UnionSet unionSet = new UnionSet(isConnected.length);
		for(int i = 0; i < isConnected.length; i++) {
			for(int j = 0; j < isConnected[i].length;j++) {
				if(isConnected[i][j] == 0) {
					continue;
				}
				unionSet.merge(i, j);
			}
		}
		Set<Integer> set= new HashSet<Integer>() ;
        /*
         *由于并查集的合并只改变了根节点的值,该集合中的其他元素与根节点值不同,
         *在使用Set去重时结果会有偏差,所以重新调用了一次find函数,emm没想出什么好的解决办法
         */
        for(int i = 0; i < unionSet.parent.length;i++) {
			unionSet.find(i);
		}
		for(int i : unionSet.parent) {
			set.add(i);
		}
        return set.size();
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值