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

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

1.想法

1.要形成锯齿状,那么一定是奇数大于偶数,或者偶数大于奇数
2.不论是奇数还是偶数,都满足nums[i] 如果不满足,那么就需要尽心调整,
1.nums[i]大于nums[i+1]或nums[i-1] 那么只需调整一次,变成nums[i] = 大于的那个数-1就行了
2.nums[i]大于nums[i+1]且nums[i-1] 那么需调整两次,变成nums[i] =min(nums[i-1],nums[i+1])-1就行了

综上,我们需要计算偶数大于和奇数大于的次数,进行比较返回

2:代码

class Solution {
     public int movesToMakeZigzag(int[] nums) {
        int temp0 = 0, temp1 = 0;//分别记录当为0或者1的时候的减去值
        int i0 = 0, i1 = 1; //分别是奇数和偶数的索引
        //计算偶数大于奇数的修改的次数
        while (i1 < nums.length) {
            int temp = nums[i1];
            if (temp >= nums[i1 - 1]) {
                temp0 += temp - nums[i1 - 1] + 1;
                temp = nums[i1 - 1] - 1;
            }
            if (i1 + 1 < nums.length) {
                if (temp >= nums[i1 + 1]) {
                    temp0 += temp - nums[i1 + 1] + 1;
                    temp = nums[i1+1]-1;
                }
            }
            i1 += 2;
        }
        //计算奇数大于偶数的修改次数
        while (i0 < nums.length) {
            int temp = nums[i0];
            if (i0 - 1 >= 0) {
                if (temp >= nums[i0 - 1]) {
                    temp1 += temp - nums[i0 - 1] + 1;
                    temp = nums[i0-1]-1;
                }
            }
            if (i0 + 1 < nums.length) {
                if (temp >= nums[i0 + 1]){
                    temp1 += temp - nums[i0 + 1] + 1;
                    temp=nums[i0+1]-1;
                }
            }
            i0 += 2;
        }
        return temp0 > temp1 ? temp1 : temp0;
    }
}

总结:这道题本身没有多少难度,但是作为测验题,却又很多人没有通过,通过率很低


1144. 递减元素使数组呈锯齿状_第1张图片
image.png

说明了人在高度紧张的时候会犯低级错误,唯有平静心态才能取得胜利

你可能感兴趣的:(1144. 递减元素使数组呈锯齿状)