思路是对于数组个数为奇数的,选择中间那个元素的数作为要移动的目标值,原因是中间的数到两边的数距离之和最短,因为从中间向两边任意一边移动都会导致其他元素到该数组距离改变,但是中间元素距离从0变为大于0,所以选择中间的元素数就可以,偶数则选择中间两个数的区间作为目标取最短距离即可。
class Solution {
public int minMoves2(int[] nums) {
int length = nums.length;
int minDis = Integer.MAX_VALUE;
Arrays.sort(nums);
if(length % 2==1){
int num = nums[nums.length/2];
int dis = 0;
for(int j=0;j<nums.length;j++){
dis += Math.abs(nums[j]-num);
}
minDis = dis;
}else{
int begin = nums[nums.length/2-1];
int end = nums[nums.length/2];
for(int i=begin;i<=end;i++){
int dis = 0;
for(int j=0;j<nums.length;j++){
dis += Math.abs(nums[j]-i);
}
if(dis < minDis){
minDis = dis;
}
}
}
return minDis;
}
}
作者:你的雷哥
本文版权归作者所有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。