当前位置: 首页 > 知识库问答 >
问题:

查找网络中的最大用户数

范瀚昂
2023-03-14

我有m行,其中x和y值用空格分隔,表示用户id。这就像用户x在Facebook或Instagram上跟踪用户y一样。现在如果我们有一对z和y,那么由于z跟踪y,因为我们已经有一个组[x,y],那么我们可以合并z形成[x,y,z]

例:

1 2
3 4
5 6
1 5

我们可以有以下组:

[1 2 5 6]和[3 4],最大组[1,2,5,6]的长度为4将是答案。

这是我对此的方法:

public int process(int m, int[][] arr) {
    List<Set<Integer>> list = new ArrayList<>();
    
    int ans = 0;
    for(int i=0; i<m; i++) {
        int x = arr[i][0], y = arr[i][1];
        if(j ==0) {
            Set<Integer> set = new HashSet<>();
            list.add(set);
            set.add(x);
            set.add(y);
            ans = 2;
            continue;
        }
        boolean found = false;
        for(Set<Integer> set : list) {
            if(set.contains(x) || set.contains(y)) {
                set.add(x);
                set.add(y);
                ans = Math.max(ans, set.size());
                found = true;
                break;
            }
        }
        if(!found) {
            Set<Integer> set = new HashSet<>();
            list.add(set);
            set.add(x);
            set.add(y);
        }
    }
    return ans;
} 

我的方法本身是错误的,因为我生成的列表没有正确分组元素。如何解决这个问题。此外,输入阵列长度可以达到100000,因此需要以较少的时间复杂度来解决这个问题。

约束条件:

x and y can range from 1 to 10^5
aray length can be up to 10^6

共有1个答案

逑和蔼
2023-03-14

您可以使用不相交集,从大小为 1 的每个组开始,并在合并时组合大小。

java prettyprint-override">public int process(int m, int[][] arr) {
    class DS {
        static int[] p = new int[100001];
        static int[] size = new int[100001];
        static int find(int x) {
            return x == p[x] ? x : (p[x] = find(p[x]));
        }
        static int merge(int x, int y) {
            int rx = find(x), ry = find(y);
            if (rx != ry) {
                p[rx] = ry;
                size[ry] += size[rx];
            }
            return size[ry];
        }
        static void init() {
            for (int i = 0; i < p.length; i++) {
                p[i] = i;
                size[i] = 1;
            }
        }
    }
    DS.init();
    int ans = 0;
    for (int[] pair: arr) 
        ans = Math.max(ans, DS.merge(pair[0], pair[1]));
    return ans;
}
 类似资料:
  • 问题内容: 对于需要解决的问题之一,我使用for循环找到了数组的最大值,因此我尝试使用递归找到它,这就是我想出的: 因此它可以正常工作并获取最大值,但是我的问题是:对于基本情况,返回a [head]以及对于在开头处的值大于最后一个值的情况,可以吗? 问题答案: 您只需一个计数器即可轻松完成此操作,只需使用您这次想要比较的值的索引即可: 这样可以更好地显示正在发生的情况,并使用默认的“递归”布局,例

  • 问题内容: 我们正在做一个用Java编码的项目(针对JRE 1.6编译),并且需要一些小但显然复杂的功能的帮助:我们想在连接特定的无线网络时执行某些操作,例如,当连接的SSID ==“ myNetworkAtHome时”或类似内容。 在浏览了该站点,谷歌和Java文档之后,我们更加接近了。在此处查看代码后:http : //download.oracle.com/javase/tutorial/n

  • 作为这个问题的一部分,我需要找到: 数字的数量(计数) 数字之和(sum) 数字的平均值(平均值) 哪些数字是偶数(偶数) 哪些数字是奇数(赔率) 我尝试在while循环中执行此操作: 其思想是,当while循环迭代时,它会将它通过的数字与最大值进行比较,并将它在计数中找到的最大值与最大值进行匹配,如果它找到的数字大于最大值,则成为新的最大值。对最小的也是同样的想法。 但它并不起作用。我该怎么办?

  • 以下是任务的具体要求: “首先,启动NetBeans并关闭之前可能打开的所有项目(在顶部菜单“转到文件”)== 然后创建一个名为“MinMax”(不带引号)的新Java应用程序,该应用程序声明一个长度为5的双精度数组,并使用方法使用来自命令行的用户输入填充数组,并打印出数组中的max(最高)和min(最低)值。确定最大值和最小值的方法可能不使用Java中的任何内置排序方法。也就是说,您需要在这些方

  • 问题开始是因为我有一个表(Clientes),其中主键不是自动递增的。我想选择存储在列数据库中的最大值。 类似于此选择,但具有雄辩的ORM(Laravel): 我该怎么做? 我试过: 我不喜欢做一个简单的原始 我来不了。 谢谢大家!

  • 问题内容: 我有这种表,找到最大的标记 学生 外面应该是这样的 但我得到这种输出 我用SQL写这个 我该如何纠正sql? 问题答案: 在SQL Server中,您可以使用 尽管您也可以使用逻辑上等效的标准SQL