给定一个长度为 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
这篇博客探讨了如何找到使非空整数数组所有元素相等所需的最小操作次数。作者尝试了三种不同的算法实现,包括逐次增加除最大值外的元素、直接增加最小值与最大值的差值,以及累加元素与最小值的差值。尽管前两种方法导致超时,但第三种方法通过累加元素与最小值的差值得到了正确的解决方案。博客还强调了刻意练习算法和数据结构的重要性。

被折叠的 条评论
为什么被折叠?



