Leetcode 3012. Minimize Length of Array Using Operations

  • Leetcode 3012. Minimize Length of Array Using Operations
    • 1. 解题思路
    • 2. 代码实现
  • 题目链接:3012. Minimize Length of Array Using Operations

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。

你可能感兴趣的:(leetcode笔记,leetcode,3012,leetcode双周赛122,leetcode,medium,leetcode题解,最大公约数)