Leetcode 3574. Maximize Subarray GCD Score
- Leetcode 3574. Maximize Subarray GCD Score
- 1. 解题思路
- 2. 代码实现
- 题目链接:3574. Maximize Subarray GCD Score
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:continueprimes.add(i)for j in range(i, n+1, i):status[j] = 1return primesPRIMES = 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:continuefor j in range(i+1, n):_gcd = gcd(_gcd, 2*nums[j])divisors.add(_gcd)if _gcd == 1 or _gcd in PRIMES:breakans = 0divisors = sorted(divisors, reverse=True)for div in divisors:if div * n <= ans:breakop, cnt = 0, 0for i, num in enumerate(nums):if div * (n-i+cnt) <= ans:breakif num % div == 0:passelif (num * 2) % div == 0:op += 1else:op, cnt = 0, 0continuecnt += 1while cnt > 0 and op > k:li = i - cnt + 1if nums[li] % div != 0:op -= 1cnt -= 1ans = max(ans, cnt * div)return ans
提交代码评测得到:耗时13858ms,占用内存19.2MB。