462. Minimum Moves to Equal Array Elements II
- User Accepted: 541
- User Tried: 653
- Total Accepted: 561
- Total Submissions: 1588
- Difficulty: Medium
Given a non-empty integer array, find the minimum number of moves required to make all array elements equal, where a move is incrementing a selected element by 1 or decrementing a selected element by 1.
You may assume the array's length is at most 10,000.
Example:
Input: [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]
public class Solution {
public int minMoves2(int[] nums) {
int res = 0;
Arrays.sort(nums);
int left = 0;
int l = 1;
int right = nums.length-1;
int r = 1;
while(left<right){
res+=(-nums[left++]+nums[left])*l++;
if(left!=right)
res+=(nums[right--]-nums[right])*r++;
}
return res;
}
}
思路:要把数组每一个数字变为n,则比n大的要加,比n小的要减,数组先排序,左边比n小右边比n大,把两边的数依次往里边收缩,
变为临近的数,比如第一个数变为第二个数,步数累加入结果里边,直到left>=right,则可求出要求的最小值。