力扣刷题日记-1144. 递减元素使数组呈锯齿状

52 阅读1分钟

给你一个整数数组 nums,每次 操作 会从中选择一个元素并 将该元素的值减少 1。 如果符合下列情况之一,则数组 A 就是 锯齿数组: 每个偶数索引对应的元素都大于相邻的元素,即 A[0] > A[1] < A[2] > A[3] < A[4] > ... 或者,每个奇数索引对应的元素都大于相邻的元素,即 A[0] < A[1] > A[2] < A[3] > A[4] < ... 返回将数组 nums 转换为锯齿数组所需的最小操作次数。

来源:力扣(LeetCode) 链接:leetcode.cn/problems/de… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:
  • 1.锯齿起点有两种可能,下标为0 的起点可能是向下,也可能是向上
  • 2.所以要求最小就要把两种方式的值求出来做比较
  • 3.确定步长为2
  • 4.如果是起点向上i(0,2,6,8...) 的位置应该比左右相邻的都小,是谷底,左右两边是峰顶
  • 5.i位置的值减去左右相邻的值,如果为正数,说明左右应该提升几步才能形成峰顶,如果是负数,说明左右两边原本就是峰顶,不需要提升,a直接取0.所以用到Math.max(0,x)
  • 6.如果是起点向下i(1,3,5,6...) 的位置应该比左右相邻的都小,是谷底,左右两边是峰顶
  • 7.同5.
  • 8.两种情况取最小值
/**
 * @param {number[]} nums
 * @return {number}
 */
var movesToMakeZigzag = function(nums) {
    return Math.min(help(nums, 0),help(nums, 1))
};
function help (nums, lowPos) {
    let res = 0
    for(let i = lowPos; i < nums.length; i+=2) {
        let a = 0;
        if(i + 1 < nums.length) {
            a = Math.max(a, nums[i] - nums[ i + 1] + 1)
        }
        if( i - 1 >=0) {
            a = Math.max(a, nums[i] - nums[i - 1] + 1)
        }
        res += a
    }
    return res
}