码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 并查集的应用


    leetcode:952.按公因数计算最大组件大小

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

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

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

    示例 1:
    在这里插入图片描述
    输入:nums = [4,6,15,35]
    输出:4

    示例 2:
    在这里插入图片描述

    输入:nums = [20,50,9,63]
    输出:2

    示例 3:
    在这里插入图片描述
    输入:nums = [2,3,6,7,4,12,21,39]
    输出:8

    提示:
    1 <= nums.length <= 2 * 10^4
    1 <= nums[i] <= 10^5
    nums 中所有值都 不同

    解法:

    class Union:
        def __init__(self, n: int):
            self.parents = list(range(n))  # 父节点
            self.height = [0] * n          # 树的高度
    
        def find(self, x) -> int:
            """if self.parents[x] != x:
                self.parents[x] = self.find(self.parents[x])
            return self.parents[x]"""
            parent = self.parents[x]
            while self.parents[parent] != parent:
                parent = self.parents[parent]
            return parent
    
        def merge(self, x: int, y: int) -> None:
            x, y = self.find(x), self.find(y)
            if x == y:
                return 
            elif self.height[x] > self.height[y]:
                self.parents[y] = x
            elif self.height[x] < self.height[y]:
                self.parents[x] = y
            else:
                self.parents[y] = x
                self.height[x] += 1
    
    class Solution:
        def largestComponentSize(self, nums: List[int]) -> int:
    
    
            # 方法一:并查集
            # 时间复杂度:O(n * alpha(n) * m**0.5)
            # 空间复杂度:O(m)
            # alpha()为反阿克曼函数
            # m = max(nums)
            union = Union(max(nums) + 1)
            for num in nums:
                i = 2
                while i * i <= num:
                    if num % i == 0:
                        union.merge(num, i)
                        union.merge(num, num // i)
                    i += 1
    
            #print(union.parents)
            #print(union.height)
            #print(Counter(union.find(num) for num in nums))
            return max(Counter(union.find(num) for num in nums).values())
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
  • 相关阅读:
    6 Java之 Debug & 进制 原码 反码 补码& 二维数组
    【C语言】文件相关操作
    【mcuclub】外部中断
    【杰理AC695X】7脚屏PWM控制亮度
    2023年SpinalHDL应用前景探索线上研讨会----征集演讲嘉宾
    Github Actions实现Spring Boot自动化部署(第二弹)
    kobject 与sysfs属性文件读写
    安利!如何提优质的ISSUE?学霸是这样写的!
    uniapp(uncloud) 使用生态开发接口详情4(wangeditor 富文本, 云对象, postman 网络请求)
    GBase 8c 创建和管理表(二)
  • 原文地址:https://blog.csdn.net/weixin_43817898/article/details/126069669
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号