该题解采用了直观的遍历方法来解决问题。为了使数组成为锯齿形数组,我们考虑两种可能的锯齿模式:1) 偶数索引的元素大于其相邻的元素;2) 奇数索引的元素大于其相邻的元素。对于每个元素,我们计算将其减少到比相邻元素小的最小操作次数,以满足当前考虑的锯齿模式。然后,对于两种模式,我们各自维护一个操作次数累计器,最后返回两种模式中需要的最小操作次数。
时间复杂度: O(n)
空间复杂度: O(1)
class Solution:
def movesToMakeZigzag(self, nums: List[int]) -> int:
n = len(nums)
# 初始化两种情况下的操作次数
count1, count2 = 0, 0
for i in range(n):
# 对于情况1:偶数索引的元素大于相邻元素
if i % 2 == 0:
left = nums[i - 1] if i > 0 else float('inf')
right = nums[i + 1] if i < n - 1 else float('inf')
# 计算当前元素应该减少的次数以确保大于左右相邻元素
count1 += max(0, nums[i] - min(left, right) + 1)
# 对于情况2:奇数索引的元素大于相邻元素
else:
left = nums[i - 1] if i > 0 else float('inf')
right = nums[i + 1] if i < n - 1 else float('inf')
# 计算当前元素应该减少的次数以确保大于左右相邻元素
count2 += max(0, nums[i] - min(left, right) + 1)
# 返回两种情况下的最小操作次数
return min(count1, count2)