当前位置: 首页 > article >正文

【Leetcode 952】按公因数计算最大组件大小

题干

给定一个由不同正整数的组成的非空数组 nums ,考虑下面的图:

  • 有 nums.length 个节点,按从 nums[0] 到 nums[nums.length - 1] 标记;
  • 只有当 nums[i] 和 nums[j] 共用一个大于 1 的公因数时,nums[i] 和 nums[j]之间才有一条边。

返回 图中最大连通组件的大小 。

解题思路

有连通查找可以想到并查集,公因数就常见思路gcd函数计算就行,常规题型的变体

思路拆解

  1. 并查集(Union-Find)

    • 使用并查集来管理连通组件。

    • 对于每个数,找到它的所有质因数,并将这些质因数与数本身合并到同一个集合中。

    • 最终,统计每个集合的大小,返回最大值。

  2. 质因数分解

    • 对于每个数,分解出它的所有质因数。

    • 将这些质因数作为桥梁,将具有相同质因数的数合并到同一个集合中。

源码

并查集模板

class UnionFind {
    int[] parent;
    int[] rank;

    public UnionFind(int n) {
        parent = new int[n];
        for (int i = 0; i < n; i++) {
            parent[i] = i;
        }
        rank = new int[n];
    }

    public void union(int x, int y) {
        int rootx = find(x);
        int rooty = find(y);
        if (rootx != rooty) {
            if (rank[rootx] > rank[rooty]) {
                parent[rooty] = rootx;
            } else if (rank[rootx] < rank[rooty]) {
                parent[rootx] = rooty;
            } else {
                parent[rooty] = rootx;
                rank[rootx]++;
            }
        }
    }

    public int find(int x) {
        if (parent[x] != x) {
            parent[x] = find(parent[x]);
        }
        return parent[x];
    }
}

 题解

 public int largestComponentSize(int[] nums) {
        int m = Arrays.stream(nums).max().getAsInt();
        UnionFind uf = new UnionFind(m + 1);
        for (int num : nums) {
            for (int i = 2; i * i <= num; i++) {
                if (num % i == 0) {
                    uf.union(num, i);
                    uf.union(num, num / i);
                }
            }
        }
        int[] counts = new int[m + 1];
        int ans = 0;
        for (int num : nums) {
            int root = uf.find(num);
            counts[root]++;
            ans = Math.max(ans, counts[root]);
        }
        return ans;
    }
}


http://www.kler.cn/a/548935.html

相关文章:

  • 3.buuctf [BSidesCF 2019]Kookie
  • 最新智能优化算法: 贪婪个体优化算法(Greedy Man Optimization Algorithm,GMOA)求解23个经典函数测试集,MATLAB代码
  • Vue3+NestJS实现后台权限管理系统上线啦!(附源码及教程)
  • 【RocketMQ 存储】CommitLogDispatcherBuildConsumeQueue 构建 ConsumeQueue 索引
  • 蓝桥杯 Java B 组之栈的应用(括号匹配、表达式求值)
  • 【第13章:自监督学习与少样本学习—13.3 自监督学习与少样本学习在图像识别、语言理解等领域的应用探索】
  • Unity实现UI拖拽
  • 腿足机器人之八- 腿足机器人动力学
  • 代码随想录算法训练营第三十八天| 动态规划02
  • BY组态:工业自动化的未来,触手可及
  • Uniapp 实现顶部标签页切换功能?
  • 【一起学Rust 框架篇 Tauri2.0框架】Tauri2.0环境搭建与项目创建
  • 【第11章:生成式AI与创意应用—11.3 AI艺术创作的实现与案例分析:DeepArt、GANBreeder等】
  • 联合概率:定义、公式和示例
  • 【第3章:卷积神经网络(CNN)——3.2卷积层、池化层、全连接层的详细介绍】
  • Tomcat的升级
  • 启程C++
  • Pycharm 2024在解释器提供的python控制台中运行py文件
  • 04性能监控与调优篇(D4_JVM参数)
  • 【算法与数据结构】并查集详解+题目