LC 6919. 使数组中的所有元素都等于零
https://leetcode.cn/problems/apply-operations-to-make-all-array-elements-equal-to-zero/
这题思路不是特别复杂:
- 对于 A[i], 如果 A[i] > 0, 那么就对 后面 K-1 个元素减去 A[i]
- 继续遍历,如果发现 A[j] < 0 的话,那么就返回 false
- 否则就是 true.
但是这个 “对后面 K-1 个元素减去 A[i]” 操作复杂度有点高,之前接触过差分数组这个概念,感觉是可以用在这个地方的。
- 对于 A[i], 我们还需要减去 A[i+1], A[i+2] … A[i+k-1] 这个几个元素
- 所以我们做一个累积值c, 如果要减去 A[i], 那么 c += A[i]
- 注意这个累计值在 A[i+k]的时候要取消掉 A[i]. 所以把这个记录在 C[i+k]=A[i] 上面
- 然后调整一下逻辑,每次遍历 A[i]之前,需要 c -= C[i]
这题有个需要注意的地方就是结尾,当我们处理 A[n-1]之后,我们还需要确保 C后面的元素(k-1)个都是 0.
class Solution: def checkArray(self, nums: List[int], k: int) -> bool: if k == 1: return True n = len(nums) C = [0] * (n + k) c = 0 for i in range(n): c -= C[i] v = nums[i] - c if v < 0: return False C[i + k] = v c += v if sum(C[-(k - 1):]) != 0: return False return True