Categorygithub.com/szhou12/leetcode-goleetcode2772-Apply-Operations-to-Make-All-Array-Elements-Equal-to-Zero
package
0.0.0-20241220224003-b7cf03a90b2b
Repository: https://github.com/szhou12/leetcode-go.git
Documentation: pkg.go.dev
# README
2772. Apply Operations to Make All Array Elements Equal to Zero
Solution idea
Diff Array (Greedy)
- 理解题意: 逆向思维,使所有元素都减为0,反过来就是,从
[0, 0, ..., 0]
开始,通过若干次 "k-size subarray + 1" 操作变成nums[]
- 破题: 从左至右,每次给长度为k的subarray
nums[l:l+k-1]
(inclusive) 增加量为X
。相当于,差分数组的diff[l] + X
和diff[l+k] + X
。e.g.,nums[0:0+k-1]
中每个元素增加nums[0]
,相当于,diff[l] + X
以及diff[l+k] + X
- 规律:
- 对于第一个元素,我们想要的增加量 delta 使得
0 -> nums[0]
。所以,delta = nums[0] - 0
。整个nums[0:k-1]
(inclusive) 都要增加 delta,也就是diff[0] + delta
和diff[k] + delta
。 - 对于第二个元素,此时第二个元素已经有一个基础量
base = nums[0]
。如果这个基础量已经大于nums[1]
,那么我们无法通过只增不减的操作得到目标nums[]
,直接返回false
。否则,我们还需要增加delta = nums[1] - base
,并且是整个nums[1:k]
(inclusive) 都要增加 delta,也就是diff[1] + delta
和diff[k+1] + delta
。 - 对于第 i 个元素,已经有的基础量为
base
。 如果base > nums[i]
,直接返回false
。否则,我们还需要增加delta = nums[i] - base
,并且是整个nums[i:i+k-1]
(inclusive) 都要增加 delta,也就是diff[i] + delta
和diff[i+k] + delta
。 - 重复上述步骤,直到最后一个元素。如果最后一个元素刚好得到
diff[n-1] + base == nums[n-1]
,那么返回true
,否则返回false
。
- 对于第一个元素,我们想要的增加量 delta 使得
Time complexity = $O(n)$
Resource
【每日一题】LeetCode 2772. Apply Operations to Make All Array Elements Equal to Zero