当前位置:   article > 正文

LeetCode 省份的数量

LeetCode 省份的数量

题目链接

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

  1. class Solution {
  2. static class UnionSet{
  3. int[] parent;
  4. public UnionSet(int length) {
  5. parent = new int[length];
  6. for(int i = 0; i < length; i++) {
  7. parent[i] = i;
  8. }
  9. }
  10. // i的根节点
  11. int find(int i) {
  12. int root = i;
  13. while(parent[root] != root)
  14. root = parent[root];
  15. while(parent[i]!=root) {
  16. int father = parent[i];
  17. parent[i] = root;
  18. i = father;
  19. }
  20. return root;
  21. }
  22. void merge(int i,int j) {
  23. int root1 = find(i);
  24. int root2 = find(j);
  25. if(root1!=root2) {
  26. parent[root2] = root1;
  27. }
  28. }
  29. }
  30. public int findCircleNum(int[][] isConnected) {
  31. UnionSet unionSet = new UnionSet(isConnected.length);
  32. for(int i = 0; i < isConnected.length; i++) {
  33. for(int j = 0; j < isConnected[i].length;j++) {
  34. if(isConnected[i][j] == 0) {
  35. continue;
  36. }
  37. unionSet.merge(i, j);
  38. }
  39. }
  40. Set<Integer> set= new HashSet<Integer>() ;
  41. /*
  42. *由于并查集的合并只改变了根节点的值,该集合中的其他元素与根节点值不同,
  43. *在使用Set去重时结果会有偏差,所以重新调用了一次find函数,emm没想出什么好的解决办法
  44. */
  45. for(int i = 0; i < unionSet.parent.length;i++) {
  46. unionSet.find(i);
  47. }
  48. for(int i : unionSet.parent) {
  49. set.add(i);
  50. }
  51. return set.size();
  52. }
  53. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/531762
推荐阅读
相关标签
  

闽ICP备14008679号