Leetcode 3012. Minimize Length of Array Using Operations

本文介绍了如何通过数学原理解决LeetCode问题3012,利用最大公约数的操作减少数组长度。作者给出了Python代码实现,并指出在604ms内完成,内存占用36.3MB。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 解题思路

这一题有一点数学题的意思,显然,根据最大公约数相关的知识,我们知道,对任意两个数反复相减,我们即可得到他们的最大公约数。

因此,这里,我们显然可以通过有限次操作,获得数组当中所有数的最大公约数。

然后,如果有一个数比其他数小,不妨设为 x x x,那么其他所有的数 y i y_i yi都可以通过 x ≡ y i ( m o d x ) x \equiv y_i (mod x) xyi(modx)进行消除,于是总可以去除掉所有比 x x x大的数。

结合上述两个结论,我们不难看到:

  • 我们可以通过有限次操作获得的最小的数一定是所有数的最小公约数,且原数组中任意比这个最小公约数大的数都可以被消掉。

因此,我们最后留下的一定就是若干个最小公约数,而对于他们,我们能够消除后保留的数目最少也会有 ⌈ n 2 ⌉ \lceil \frac{n}{2} \rceil 2n

2. 代码实现

给出python代码实现如下:

class Solution:
    def minimumArrayLength(self, nums: List[int]) -> int:
        elems = sorted(set(nums))
        _gcd = elems[0]
        for x in elems[1:]:
            _gcd = gcd(_gcd, x)
            if _gcd == 1:
                break
        if _gcd in elems:
            return (Counter(nums)[_gcd] + 1) // 2
        else:
            return 1

提交代码评测得到:耗时604ms,占用内存36.3MB。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值