赞
踩
思路:使用并查集,遍历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();
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。