Leetcode 3574. Maximize Subarray GCD Score

发布于:2025-06-12 ⋅ 阅读:(24) ⋅ 点赞:(0)

1. 解题思路

这一题是基于deepseek的实现上面搞定的,虽然deepseek事实上也是超时……

我的直接思路就是动态规划,但是那样是会直接超时的,而deepseek的解决方式是首先找出所有可能的最大公约数,然后考察其对应的score,最后取出其中的最大值。

但是deepseek的解答还是超时了,原因在于其要对每一个数找出其所有的约数,由于数字最大可以到 10 9 10^9 109,因此单个数的查找会非常耗时,我们也就是在这里做了一下优化,具体来说就是直接二重遍历一下所有的区间内的最大公约数,而不是考察每一个数的约数。

如此修改之后,代码勉强通过了全部测试样例,也是挺坑的……

2. 代码实现

给出python代码实现如下:

def get_primes(n):
    primes = set()
    status = [0 for _ in range(n+1)]
    for i in range(2, n+1):
        if status[i] == 1:
            continue
        primes.add(i)
        for j in range(i, n+1, i):
            status[j] = 1
    return primes

PRIMES = get_primes(10**5)

class Solution:
    def maxGCDScore(self, nums: List[int], k: int) -> int:
        n = len(nums)
        if len(set(nums)) == 1:
            return max(n * nums[0], min(n, k) * 2 * nums[0])

        divisors = set()
        for i in range(n):
            _gcd = 2*nums[i]
            divisors.add(nums[i])
            divisors.add(_gcd)
            if _gcd in divisors and _gcd in PRIMES:
                continue
            for j in range(i+1, n):
                _gcd = gcd(_gcd, 2*nums[j])
                divisors.add(_gcd)
                if _gcd == 1 or _gcd in PRIMES:
                    break

        ans = 0
        divisors = sorted(divisors, reverse=True)
        for div in divisors:
            if div * n <= ans:
                break
            op, cnt = 0, 0
            for i, num in enumerate(nums):
                if div * (n-i+cnt) <= ans:
                    break
                if num % div == 0:
                    pass
                elif (num * 2) % div == 0:
                    op += 1
                else:
                    op, cnt = 0, 0
                    continue
                cnt += 1
                while cnt > 0 and op > k:
                    li = i - cnt + 1
                    if nums[li] % div != 0:
                        op -= 1
                    cnt -= 1
                ans = max(ans, cnt * div)
        return ans

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