1144. 递减元素使数组呈锯齿状

【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)
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容