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

【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.dtcms.com/a/21166.html

相关文章:

  • LLM大模型学习资料整理
  • Java爬虫获取1688商品搜索API接口的实现指南
  • python | 两招解决第三方库安装难点
  • 如何画产品功能图、结构图
  • 进程与线程的区别与联系
  • Lazarus 旋转图片(TImage、TBitmap)
  • 我们来学HTTP/TCP -- 三次握手?
  • 2025 pwn_A_childs_dream
  • C++中 map的基本用法
  • 春招项目=图床+ k8s 控制台(唬人专用)
  • 委托构造函数与继承构造函数
  • nginx反向代理负载均衡
  • 数据结构 day02
  • 2024年度中国家居冠军榜公布,冠珠瓷砖荣获“行业领军品牌”
  • 深度学习(1)-简单神经网络示例
  • 力扣 乘积最大子数组
  • 【数据结构基础_链表】
  • 基因组数据分析中涉及基因结构的问题
  • 论文解读之DeepSeek R1
  • 【函数题】6-10 二分查找
  • 全方位探索DeepSeek
  • ROS turtlesim 无法通过 键盘控制 turtle 移动
  • DeepSeek与ChatGPT:AI语言模型的全面对决
  • 单链表的概念,结构和优缺点
  • 使用Python和OpenCV实现图像像素压缩与解压
  • Llama3.0论文学习笔记: The Llama 3 Herd of Models
  • 硬件实用技巧:核心板与底板之间的连接方式:DIP、板对板连接器、金手指和邮票孔
  • volatile关键字
  • 贝壳和鹅卵石分类数据集4250张2类别
  • ReactiveSwift模拟登录功能