题目描述:
Given a non-empty integer array of size n, find the minimum number of moves required to make all array elements equal, where a move is incrementing n - 1 elements by 1.
思路一:
n:数组长度
x:所有数相等之后的数
m:步数
sum:原数列之和
minNum:原数列中最小数
已知:
sum + m * (n - 1) = x * n
x = minNum + m
求:m
得:m = sum - minNum * n
时间复杂度O(n)。
class Solution {
public int minMoves(int[] nums) {
int sum = 0;
int minNumber = Integer.MAX_VALUE;
for (int num : nums)
{
sum += num;
if (num < minNumber)
minNumber = num;
}
return sum - minNumber * nums.length;
}
}
思路二:
时间复杂度O(nlogn)。
class Solution {
public int minMoves(int[] nums) {
if (nums.length < 2)
return 0;
Arrays.sort(nums);
int end = nums.length - 1;
int move = 0;
while (nums[end] != nums[0] && end >= 0)
{
int incre = nums[end] - nums[0];
move += incre;
nums[0] += incre;
end--;
nums[end] += move;
}
return move;
}
}