持续创作,加速成长!这是我参与「掘金日新计划 · 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
- 循环上边两步,知道数组中的每个数都相等 看似完美,一提交
芭比Q了,超时了,这可如何是好,想了半天也没想到,这可是简单题啊,于是去看了题解,看完之后我只想说我和评论中大兄弟的想法一下,如下图:
我默默的在评论里来了个+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
};
结果如下:
总结
看到这题正解的时候我真的是想笑又想哭,唉,还是做题太少了,遇到问题脑子都不会转圈了,还得多做多看,俗话说的好,背会唐诗三百首,不会写诗也会偷。