当前位置:   article > 正文

leetcode:省份数量_leetcode 省份数量

leetcode 省份数量
n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。
省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。
给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。
返回矩阵中省份的数量。
  1. package com.lz.third;
  2. import java.util.LinkedList;
  3. import java.util.Queue;
  4. public class GroupMerge {
  5. public static void main(String[] args) {
  6. // TODO Auto-generated method stub
  7. //System.out.println(getProvince(new int[][] {{1,0,0},{0,1,0},{0,0,1}}));
  8. //System.out.println(getProvince(new int[][] {{1,1,0},{1,1,0},{0,0,1}}));
  9. //System.out.println(getProvince1(new int[][] {{1,0,0},{0,1,0},{0,0,1}}));
  10. //System.out.println(getProvince1(new int[][] {{1,1,0},{1,1,0},{0,0,1}}));
  11. System.out.println(getProvince2(new int[][] {{1,0,0},{0,1,0},{0,0,1}}));
  12. System.out.println(getProvince2(new int[][] {{1,1,0},{1,1,0},{0,0,1}}));
  13. }
  14. //深度优先
  15. private static int getProvince(int[][] isConnected) {
  16. int cities=isConnected[0].length;
  17. boolean[] visited=new boolean[cities];
  18. int provinces=0;
  19. for(int i=0;i<cities;i++) {
  20. if(!visited[i]) {
  21. dfs(i,cities,visited,isConnected);
  22. provinces++;
  23. }
  24. }
  25. return provinces;
  26. }
  27. public static void dfs(int i,int cities,boolean[] visited,int[][] isConnected) {
  28. for(int j=0;j<cities;j++) {
  29. if(isConnected[i][j]==1&&!visited[j]) {
  30. visited[j]=true;
  31. dfs(j,cities,visited,isConnected);
  32. }
  33. }
  34. }
  35. //广度优先
  36. private static int getProvince1(int[][] isConnected) {
  37. int cities=isConnected[0].length;
  38. boolean[] visited=new boolean[cities];
  39. int provinces=0;
  40. Queue<Integer> queue=new LinkedList<Integer>();
  41. for(int i=0;i<cities;i++) {
  42. if(!visited[i]) {
  43. queue.offer(i);
  44. while(!queue.isEmpty()) {
  45. int k=queue.poll();
  46. visited[k]=true;
  47. for(int j=i+1;j<cities;j++) {
  48. if(isConnected[i][j]==1&&!visited[j]) {
  49. queue.offer(j);
  50. }
  51. }
  52. }
  53. provinces++;
  54. }
  55. }
  56. return provinces;
  57. }
  58. //并查集
  59. private static int getProvince2(int[][] isConnected) {
  60. int cities=isConnected[0].length;
  61. int[] head=new int[cities];
  62. int[] level=new int[cities];
  63. for(int i=0;i<cities;i++) {
  64. head[i]=i;
  65. level[i]=1;
  66. }
  67. for(int i=0;i<cities;i++) {
  68. for(int j=i+1;j<cities;j++) {
  69. if(isConnected[i][j]==1) {
  70. merge(i,j,head,level);
  71. }
  72. }
  73. }
  74. int count=0;
  75. for(int i=0;i<cities;i++) {
  76. if(head[i]==i) {
  77. count++;
  78. }
  79. }
  80. return count;
  81. }
  82. public static void merge(int x,int y,int[] head,int[] level) {
  83. int i=find(x,head);
  84. int j=find(y,head);
  85. if(i==j) {
  86. return;
  87. }
  88. if(level[i]<=level[j]) {
  89. head[i]=j;
  90. }else {
  91. head[j]=i;
  92. }
  93. level[j]++;
  94. }
  95. public static int find(int x,int[] head){
  96. if(head[x]==x) {
  97. return x;
  98. }
  99. head[x]=find(head[x],head);
  100. return head[x];
  101. }
  102. }

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

闽ICP备14008679号