LeetCode453- 最小操作次数使数组元素相等 | 算法练习系列

90 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

前言

当遇到问题的时候一定要换种思路来看问题,换种思路可能就会拨开云雾见光明,就比如下面这道题目。

题目描述

给你一个长度为 n 的整数数组,每次操作将会使 n - 1 个元素增加 1 。返回让数组所有元素相等的最小操作次数。

 

示例 1:

输入:nums = [1,2,3]

输出:3

解释:

只需要3次操作(注意每次操作会增加两个元素的值): [1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]

示例 2:

输入:nums = [1,1,1]

输出:0

解题思路

先来看一下我第一次写的代码吧

    /**
 * @param {number[]} nums
 * @return {number}
 */
 var isEqual = function (arr) {
      return arr.every(function (item, index, arr) {
        return item === arr[0]
      })
    }
var minMoves = function(nums) {
    let result = 0
    if(isEqual(nums)){
        return result
    }
    while(!isEqual(nums)){
        nums.sort((a,b)=>a-b)
        for(let i=0;i<nums.length-1;i++){
            nums[i]+=1
        }
        result++
    }
    return result

};

嗯,调理清晰,情况也都考虑到了。

  • 首先是当输入的是本来就相等的数组的时候,直接返回0就行
  • 再这就是进行排序,让前n-1个数都加1
  • 循环上边两步,知道数组中的每个数都相等 看似完美,一提交

image.png 芭比Q了,超时了,这可如何是好,想了半天也没想到,这可是简单题啊,于是去看了题解,看完之后我只想说我和评论中大兄弟的想法一下,如下图:

image.png 我默默的在评论里来了个+1。。。。

言归正传,这题的主要思路还是要换个方向想问题,题目中的要求是每次n-1个数加1,那不就相当于每次一个数减1就行了吗?然后减到每个数都和最小的数相等位置,代码如下:

/**
 * @param {number[]} nums
 * @return {number}
 */
 var minMoves = function (arr) {
     let min = Math.min(...arr)
     let result = 0
     for(let item of arr){
         result+=item-min //当前值减最小值即为要减的次数
     }
    return result
};

结果如下:

image.png

总结

看到这题正解的时候我真的是想笑又想哭,唉,还是做题太少了,遇到问题脑子都不会转圈了,还得多做多看,俗话说的好,背会唐诗三百首,不会写诗也会偷。