给定一个长度为 n 的 非空 整数数组,每次操作将会使 n - 1 个元素增加 1。找出让数组所有元素相等的最小操作次数。
想了3分钟都要看题解了,先把这个写出来试试
第一种:
将 1 添加到除最大元素之外的所有元素,并增加移动数的计数
var minMoves = function (nums) {
let result = 0;
while(Math.min(...nums) !== Math.max(...nums)){
let max = Math.max(...nums);
let j = nums.findIndex(val=>max==val);
nums = nums.map((val,i)=>{
return i == j? val:val + 1
})
result++;
}
return result;
};
测试用例通过,提交超时(自己没有用多例子测试,只顾着解题的高兴了)
第二种:
直接让最小值加到最大值
,提交又超时了,这个时候回过神了,需要找规律了
var minMoves = function (nums) {
let result = 0;
while(Math.min(...nums) !== Math.max(...nums)){
let minute = Math.max(...nums) - Math.min(...nums)
let max = Math.max(...nums);
let j = nums.findIndex(val=>max==val);
nums = nums.map((val,i)=>{
return i == j ? val : val + minute
})
result += minute;
}
return result;
};
第三种:
最小的n-1个元素都++ 相当于 把最大的元素–,
也就是每次把最大的元素-1 直到所有元素都等于最小元素
所有元素与最小元素的差之和
var minMoves = function (nums) {
let min = Math.min(...nums);
return nums.reduce((result,val, i) => {
return val - min + result
},0)
}
你不想使用js自带的Math.min、reduce方法可以用这种
var minMoves = function (nums) {
let min = nums[0];
for (let i = 1; i < nums.length; i++) {
if (min > nums[i]) {
min = nums[i]
}
}
let result = 0;
for (let i = 0; i < nums.length; i++) {
result = nums[i] - min + result;
}
return result;
}
继续努力。
刻意练习的步骤在这里可以参考:
日期
2021.04.28
2021.04.29