算法日志 --- 12.11---最少操作使数组递增

84 阅读2分钟

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

又到了痛苦周日了,健个身先继续工作

最少操作使数组递增

该题出自力扣的1827题 —— 最少操作使数组递增【简单题】

审题

给你一个整数数组 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 的数组是严格递增的一种特殊情况。

  • 该题确实简单,直接利用贪心一路碾压过去就行了
  • 给出一个整型数组,每次对数组内的一个数字加一,最终统计转换成递增数组的叠加次数
  • 首先判断长度是否为1,如果为1,直接剪枝返回0
    • 定义数组下标1的元素为最小值,从1开始遍历数组
      • 判断如果当前下标小于等于最小值元素,次数加上最小值减去当前下标并且加一的值
      • 否则当前值为最小值覆盖
  • 因此为了使最终使 nums 严格递增,我们只需要从左到右使每一个数取到其对应的下限即可,其中当 i=0 时,其下限为nums[0]
  • 每一次我们可以进行一次操作:选择数组中的一个元素,并将它增加 1。继续遍历下一个元素,直到遍历完整个数组。
  • 时间复杂度:O(n),其中 n 为数组 nums 的长度。
  • 空间复杂度:O(1),仅使用常量空间。

编码

class Solution {
    public int minOperations(int[] nums) {
        int len = nums.length;
        if (len == 1)return 0;
        int min = nums[0];
        int num = 0;
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] <= min){
                num += ++min - nums[i];
            }else {
                min = nums[i];
            }
        }
        return num;
    }
}

image.png