每日一题 -- leetCode1144

138 阅读2分钟

image.png 「这是我参与2022首次更文挑战的第15天,活动详情查看:2022首次更文挑战

前言

每日一题,轻松解题

每日一题为刷题系列 每日刷一题LeetCode题,并且对题目进行分析,分享思路。

正文

:递减元素使数组呈锯齿状

难度:中等

题目要求:

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

分析题目:

一个数组,每次可以使其中一项的值减一,最后要使偶数都大于相邻的值,或者奇数都大于相邻的值,最后返回最少需要操作几次。

举个例子

输入: nums = [1,2,3]
输出: 2
解释: 我们可以把 2 递减到 0,或把 3 递减到 1。

:解题

理清思路:

分析:
因为所有数字只能递减,所以我们找到根据要求需要递减的数,分两种情况
1)对于偶数索引都要大于相邻元素的我们判断奇数索引位,因为此时奇数索引位需要小于两边的数据,则 num[i-1]>num[i]<num[i+1],此时如果元数据不满足则需要调整的就是奇数索引数据,判断与两边的差值,比如元数据是7>8<5,则8-7=1<8-5=3,取大的值,元数据需要调整为8-(3+1)=4,调整次数为4
2)同上,此时判断偶数索引位

编辑代码:

1.首先定义一个函数,传入一个字符串,

function toSawtooth (nums)  {
    const length = nums.length;
    if (length === 1 || length === 2) {
        return 0;
    }
};
  • (参数检验)先判断字符串是否是三个字符以上的
  • 只有三个字符以上,才能构成锯齿字符串

2.定义变量,拷贝数组

    let oddSum = 0, evenSum = 0;
    // 拷贝一下是为了在后面减数的时候不修改原数组
    const copy1 = [...nums];
    const copy2 = [...nums];
  • 定义两个变量,分别存放改变偶数和奇数到符合条件需要的次数
  • 拷贝数组

3.遍历数组,判断改变奇数还是偶数

    // 奇数
    for (let i = 1; i < length; i += 2) {
    //判断左边
        if (copy1[i - 1] >= copy1[i]) {
            // 变化的步长就是 copy1[i - 1] - copy1[i] + 1
            // 下面的都同理
            oddSum += (copy1[i - 1] - copy1[i] + 1);
            copy1[i - 1] -= (copy1[i - 1] - copy1[i] + 1);
        };
    //判断右边
        if (copy1[i + 1] >= copy1[i]) {
            oddSum += (copy1[i + 1] - copy1[i] + 1);
            copy1[i + 1] -= (copy1[i + 1] - copy1[i] + 1);
        };
    }
    
    //偶数
    for (let i = 0; i < length; i += 2) {
    //判断左边
        if (copy2[i - 1] >= copy2[i]) {
            evenSum += (copy2[i - 1] - copy2[i] + 1);
            copy2[i - 1] -= (copy2[i - 1] - copy2[i] + 1);
        };
    //判断右边
        if (copy2[i + 1] >= copy2[i]) {
            evenSum += (copy2[i + 1] - copy2[i] + 1);
            copy2[i + 1] -= (copy2[i + 1] - copy2[i] + 1);
        };
    }
    
    return Math.min(oddSum, evenSum);
  • 两个for循环分别判断奇偶数需要的步数
  • for循环中有两个if 分别判断与左边和右边大小比较,如果小于,次数加一,再次判断
  • 最后将两个步数用来比较,哪个小就是最少操作数

总结

无论做什么分析最重要,其中我们分析了题目,分析了解题思路,其实在分析完解题思路后,代码其实就是很简单的事情了,养成习惯,无论做什么之前,都要进行分析,这样有助于你更快更好的完成这件事。