【Description】
给你一个整数数组 nums,每次 操作 会从中选择一个元素并 将该元素的值减少 1。
如果符合下列情况之一,则数组 A 就是 锯齿数组:
每个偶数索引对应的元素都大于相邻的元素,即 A[0] > A[1] < A[2] > A[3] < A[4] > ...
或者,每个奇数索引对应的元素都大于相邻的元素,即 A[0] < A[1] > A[2] < A[3] > A[4] < ...
返回将数组 nums 转换为锯齿数组所需的最小操作次数。
示例 1:
输入:nums = [1,2,3]
输出:2
解释:我们可以把 2 递减到 0,或把 3 递减到 1。
示例 2:
输入:nums = [9,6,1,6,2]
输出:4
【Idea】
主要是思路,代码优化没有什么trick
分奇偶规则两种遍历:
当当前下标为奇数/ 偶数位时, 大于or小于后面一位元素时,将大的元素递减为较小元素-1的值
一个tips:
元素只能减, 不能加
【Solution】
class Solution:
def movesToMakeZigzag(self, nums: List[int]) -> int:
length = len(nums)
cnt0 = 0
tp_num = copy.copy(nums)
for i in range(length): # 偶数规则
# 如果遍历位是偶数索引并且该元素小于后面一位 => 把后面元素置为-1的元素
if i%2 == 0 and i+1 <= length-1 and tp_num[i] <= tp_num[i+1]:
cnt0 += tp_num[i+1] - (tp_num[i]-1)
tp_num[i+1] = tp_num[i] - 1
# 如果遍历位是奇数索引并且该元素大于后面一位 => 该元素置为后面元素-1
elif i%2 == 1 and i+1 <= length-1 and tp_num[i] >= tp_num[i+1]:
cnt0 += abs(tp_num[i]+1 - tp_num[i+1])
tp_num[i] = tp_num[i+1] - 1
tp_num = nums
cnt1 = 0
for j in range(length): # 奇数规则
# 如果是奇数索引判定并且该元素小于后面一位, 把后面元素置为-1的元素
if j%2 == 1 and j+1 <= length-1 and tp_num[j] <= tp_num[j+1]:
cnt1 += abs(tp_num[j]-1 - tp_num[j+1])
tp_num[j+1] = tp_num[j] - 1
# 如果是偶数索引并且该元素大于等于后面一位 => 把该元素置位后一位元素-1
elif j%2 == 0 and j+1 <= length-1 and tp_num[j] >= tp_num[j+1]:
cnt1 += abs(tp_num[j]+1 - tp_num[j+1])
tp_num[j] = tp_num[j+1] + 1
return min(cnt0, cnt1)
网友评论