//解题时间:4月24日
//解法一:穷举法,效率很低:6%
//关键思路:必须以数组内其中一个值为基准不变
//解释:为什么要选里面的值,不选数组以外的值?
var minMoves2 = function(nums) {
let stepCounter = 0;
let minStep = Number.MAX_VALUE;
for(let i = 0; i <= nums.length; i++){
stepCounter = 0;
for(let j = 0; j < nums.length; j++){
stepCounter += Math.abs(nums[j] - nums[i])
}
if(stepCounter < minStep) minStep = stepCounter
}
return minStep
}
//解题时间:4月24日,解题效率:98%
//解法二:
//解题思路:
//解释:升序a,b,c.
//以a为基准,结果为 (b-a) + (c-a)
//以b为基准,结果为 (b-a) + (c-b)
//以c为基准,结果为 (c-a) + (c-b)
//对比之下,以b为基准的值最小,值为c-a
//回答选组外值的问题,如果选组外值x,
//如果x在组是最小,则为(c-x)+(b-x)+(a-x) > (c-a)+(b-a)+(a-a) --->1.
//如果x在组是最大,则为(x-c)+(x-c)+(x-a) > (c-a)+(b-a)+(c-c) --->2.
//如果x在组是中间,比如x只比a大,则为(c-x)+(b-x)+(x-a) > (c-b) --->3.备注(b-x)+(x-a)
//=== 0
//综上所述,以b为基准的值最小。
var minMoves2 = function(nums) {
if(nums.length === 1) return 0
nums.sort((a,b) => a - b);
let maxMIddleIndex = Math.floor(nums.length / 2);
let minMiddleIndex = maxMIddleIndex - 1;
let result1 = 0;
let result2 = 0;
for(let i = 0; i < nums.length; i++){
result1 += Math.abs(nums[maxMIddleIndex] - nums[i]);
result2 += Math.abs(nums[minMiddleIndex] - nums[i]);
}
return Math.min(result1, result2)
}
//解题时间:4月24日,解题效率:98.53%
/**
* @param {number[]} nums
* @return {number}
*/
var minMoves2 = function(nums) {
//First sort the array so we can easily identify median.
let sortedArray = nums.sort((a,b)=>{ return a-b });
//This is the number that we desire to move to
let desiredNum = sortedArray[Math.floor(sortedArray.length /2)];
let moves = 0;
for(let i = 0; i < sortedArray.length; i++){
if(sortedArray[i] === desiredNum){
continue;
}
else {
moves = moves + Math.abs(sortedArray[i] - desiredNum)
}
}
return moves;
};