查看: 914| 回复: 2
跳转到指定楼层
上一主题 下一主题
收起左侧

[Leetcode] Leetcode 323 - Union-Find bug 求解

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
原题如下:Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), write a function to find the number of connected components in an undirected graph.

感觉非常直观的一道Union-Find的题目,但是有一个test case 中的输出值竟然为负数,百思不得其解,求大神提点我一下哪里出了问题,谢谢。

代码如下:

  1. public class Solution {
  2.     public int CountComponents(int n, int[][] edges) {
  3.         UnionFind uf = new UnionFind(n);
  4.         for(int i=0; i<edges.Length; i++)
  5.         {
  6.             uf.Union(edges[i][0], edges[i][1]);   
  7.         }
  8.         return uf.Count();
  9.     }
  10. }

  11. public class UnionFind{
  12.     private int count;
  13.     private int[] arr;
  14.     private int[] sizes;
  15.     public UnionFind(int n){
  16.         count = n;
  17.         arr = new int[n];
  18.         sizes = new int[n];
  19.         for(int i=0; i<n; i++){
  20.             arr[i] = i;
  21.             sizes[i] = 1;
  22.         }
  23.     }
  24.    
  25.     public int Count(){
  26.         return count;
  27.     }
  28.    
  29.     public bool Connected(int p, int q){
  30.         return Find(p)==Find(q);
  31.     }
  32.    
  33.     public bool Union(int p, int q){
  34.         int val_p = Find(p);
  35.         int val_q = Find(q);
  36.         if(val_p==val_q) return false;
  37.         
  38.         if(sizes[val_p]>sizes[val_q]){
  39.             arr[q] = val_p;
  40.             sizes[val_p]+=sizes[val_q];
  41.         }
  42.         else{
  43.             arr[p] = val_q;
  44.             sizes[val_q]+=sizes[val_p];
  45.         }
  46.         
  47.         count--;
  48.         return true;
  49.     }
  50.    
  51.     private int Find(int p){
  52.         while(p!=arr[p]){
  53.             p = arr[p];
  54.         }
  55.         return p;
  56.     }
  57. }
复制代码



上一篇:问个需要从c++翻译成Java的字符串题
下一篇:[分享]在线Leetcode题解电子书
全局:
40行和44行不对。应该是arr[val_q] = val_q。另外,你的uf没加path compression。可能会比较慢。

评分

参与人数 3大米 +6 收起 理由
14417335 + 2
doctral + 2 很有用的信息!
格林匹施ZELQ + 2 欢迎分享你知道的情况,会给更多积分奖励!

查看全部评分

回复

使用道具 举报

🔗
 楼主| doctral 2020-9-8 12:10:19 | 只看该作者
全局:
不知道小帅 发表于 2020-9-8 10:51
40行和44行不对。应该是arr[val_q] = val_q。另外,你的uf没加path compression。可能会比较慢。

非常感谢,终于找到bug了。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表