Given an integer array nums
of size n
, return the minimum number of moves required to make all array elements equal.
In one move, you can increment or decrement an element of the array by 1
.
Example 1:
Input: nums = [1,2,3] Output: 2 Explanation: Only two moves are needed (remember each move increments or decrements one element): [1,2,3] => [2,2,3] => [2,2,2]
Example 2:
Input: nums = [1,10,2,9] Output: 16
Constraints:
n == nums.length
1 <= nums.length <= 105
-109 <= nums[i] <= 109
class Solution { public int minMoves2(int[] nums) { Arrays.sort(nums); int t = nums[nums.length / 2]; int res = 0; for(int i : nums) res += Math.abs(t - i); return res; } }
找中间
class Solution { public int minMoves2(int[] nums) { Arrays.sort(nums); int t = help(nums, 0, nums.length - 1, nums.length / 2 ); int res = 0; for(int i : nums) res += Math.abs(t - i); return res; } public int help(int[] nums, int low, int high, int k) { int i = low - 1; int pivot = nums[high]; for(int j = low; j < high; j++){ if(nums[j] < pivot){ i++; swap(i, j, nums); } } swap(i+1, high, nums); if(i+1 == k) return nums[i+1]; else if(i + 1 < k) return help(nums, i + 2, high, k); else return help(nums, low, i, k); } public void swap(int i, int j, int[] nums){ int a = nums[i] + nums[j]; nums[j] = a - nums[j]; nums[i] = a - nums[j]; } }
用快select还慢了。。