To make all elements equal in an array where you can increment or decrement any element by 1, the most efficient way is to make all elements equal to the median of the array. The median minimizes the sum of absolute differences from the median, providing the minimum number of moves required to make all array elements equal.
Here are the steps:
Sort the array.
Find the median of the array.
Calculate the sum of absolute differences from the median for each element in the array.
classSolution:
defminMoves2(self, nums: List[int]) -> int:
nums.sort()
k = nums[len(nums) >>1]
return sum(abs(v - k) for v in nums)
1
2
3
4
5
6
7
8
9
10
11
12
classSolution:
defminMoves2(self, nums: List[int]) -> int:
defmove(i):
v = nums[i]
a = v * i - s[i]
b = s[-1] - s[i +1] - v * (n - i -1)
return a + b
nums.sort()
s = [0] + list(accumulate(nums))
n = len(nums)
return min(move(i) for i in range(n))
1
2
3
4
5
6
7
8
9
10
11
classSolution {
publicintminMoves2(int[] nums) {
Arrays.sort(nums);
int k = nums[nums.length>> 1];
int ans = 0;
for (int v : nums) {
ans += Math.abs(v - k);
}
return ans;
}
}
1
2
3
4
5
6
7
8
9
10
classSolution {
public:int minMoves2(vector<int>& nums) {
sort(nums.begin(), nums.end());
int k = nums[nums.size() >>1];
int ans =0;
for (int& v : nums) ans += abs(v - k);
return ans;
}
};
impl Solution {
pubfnmin_moves2(mut nums: Vec<i32>) -> i32 {
nums.sort();
let mid = nums[nums.len() /2];
letmut res =0;
for num in nums.iter() {
res += (num - mid).abs();
}
res
}
}