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

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

1.想法

1.要形成锯齿状,那么一定是奇数大于偶数,或者偶数大于奇数
2.不论是奇数还是偶数,都满足nums[i]<nums[i-1]&nums[i]<nums[i+1]
如果不满足,那么就需要尽心调整,
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;
    }
}

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


image.png

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

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

友情链接更多精彩内容