1827. 最少操作使数组递增

181 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第19天,点击查看活动详情

题目 leetcode.cn/

  • 给你一个整数数组 nums (下标从 0 开始)。每一次操作中,你可以选择数组中一个元素,并将它增加 1 。

    • 比方说,如果 nums = [1,2,3] ,你可以选择增加 nums[1] 得到 nums = [1,3,3] 。
  • 请你返回使 nums 严格递增 的 最少 操作次数。

  • 我们称数组 nums 是 严格递增的 ,当它满足对于所有的 0 <= i < nums.length - 1 都有 nums[i] < nums[i+1] 。一个长度为 1 的数组是严格递增的一种特殊情况。

示例

  • 输入: nums = [1,1,1];输出: 3

    • 解释: 你可以进行如下操作:
      1. 增加 nums[2] ,数组变为 [1,1,2] 。
      2. 增加 nums[1] ,数组变为 [1,2,2] 。
      3. 增加 nums[2] ,数组变为 [1,2,3] 。
  • 输入: nums = [1,5,2,4,1];输出: 14

  • 输入: nums = [8];输出: 0

提示

  • 1 <= nums.length <= 5000
  • 1 <= nums[i] <= 100000

代码

function minOperations(nums: number[]): number {
    let count = 0
    for(let k = 0; k < nums.length - 1; k++){
        if(nums[k] >= nums[k+1]){
            count += nums[k] - nums[k+1] + 1;
            nums[k+1] = nums[k+1] + nums[k] - nums[k+1] + 1;
        }
    }
    return count;
};
  • 在不改变原数组内元素位置的前提下,将原数组变为严格的升序数组。而且每次只能使元素加一

  • 一次遍历:

    • 遍历整个数组,得到数组内的每一项。将数组的前一项和后一项比较
    • 如果前一项大于等于后一项,那么这两项就不是按照严格递增顺序的,需要使用加一操作
    • 加多少?前一项减去后一项的差值,还要加上一,如果只加上差值的话,只能做到和前一项相等
    • 然后再将加的结果赋值给小的那一项,记得在原来的基础上加上所做加一操作的次数
    • 如果前一项小于后一项,那么不做任何操作,因为它本来就是严格递增的
  • 循环的遍历范围:如果从数组的第一项开始,那么一直取到数组的倒数第二位,因为下方要比较后一项nums[k+1]。也可以从数组的第二位开始取,每次比较当前项和前一项的大小,这样一直取值到数组最后一位