给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数,其中每次移动可将选定的一个元素加1或减1。 您可以假设数组的长度最多为10000。
例如:
输入: [1,2,3]
输出: 2
说明: 只有两个动作是必要的(记得每一步仅可使其中一个元素加1或减1):
[1,2,3] => [2,2,3] => [2,2,2]
java代码:
public class Solution {
public void swap(int[] list, int i, int pivot_index) {
int temp = list[i];
list[i] = list[pivot_index];
list[pivot_index] = temp;
}
public int partition(int[] list, int left, int right) {
int pivotValue = list[right];
int i = left;
for (int j = left; j <= right; j++) {
if (list[j] < pivotValue) {
swap(list, i, j);
i++;
}
}
swap(list, right, i);
return i;
}
int select(int[] list, int left, int right, int k) {
if (left == right) {
return list[left];
}
int pivotIndex = partition(list, left, right);
if (k == pivotIndex) {
return list[k];
} else if (k < pivotIndex) {
return select(list, left, pivotIndex - 1, k);
} else {
return select(list, pivotIndex + 1, right, k);
}
}
public int minMoves2(int[] nums) {
int sum = 0;
int median = select(nums, 0, nums.length - 1, nums.length / 2);
for (int num : nums) {
sum += Math.abs(median - num);
}
return sum;
}
}
|