最小移动次数使数组元素相等
题目
给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移动次数。每次移动可以使 n - 1 个元素增加 1。
示例:
输入:
[1,2,3]
输出:
3
解释:
只需要3次移动(注意每次移动会增加两个元素的值):
[1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-moves-to-equal-array-elements
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
最简单的想法就是循环遍历,暴力破解.首先找到最大数的索引和最小数的索引,将除最大数索引位置上的数全部加1,最后直到最大数和最小数相等.时间复杂度为n^2*最大最小数之差.会超时
优化的想法就是不再每次加1,直接加最大最小数之差,这样可以有效缩短时间.但时间复杂度还是n^2.
在优化就可以将思路转化,除最大数之外都加1也就是相当于将最大数减一,直至最大数减到最小,那么可以理解成将所有的的数字加起来与最小数字加起来的差值就是次数
代码
最后的优化
class Solution {
public int minMoves(int[] nums) {
int min = nums[0];
int total = 0;
for(int i = 0;i < nums.length;i++){
total+=nums[i];
if(min > nums[i]){
min = nums[i];
}
}
return total-(min*nums.length);
}
}