Minimum Moves to Equal Array Elements II
第20天。
今天的题目是 Minimum Moves to Equal Array Elements II :
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:
1 | Input: |
这道题需要一些数学推导,它的目标就是:
$$
min_k { \sum_{i=1}^n |n_i - n_k| }
$$
其中 $n_i$ 表示数组排序后中第 $i$ 个元素。
我们将式子展开可以得到:
$$
min_k { \sum_{i=1}^n |n_i - n_k| } =
min_k { \sum_{i=1}^k (n_k-n_i) + \sum_{i=k+1}^n(n_i-n_k) } \
= min_k { \sum_{i=1}^k n_k - \sum_{i=1}^k n_i + \sum_{i=k+1}^n n_i - \sum_{i=k+1}^n n_k } \
= min_k { \sum_{i=k+1}^n n_i - \sum_{i=1}^k n_i + (2k - n)n_k }
$$
因此,我们可以写出如下代码:
1 | int minMoves2(vector<int>& nums) { |
这样还不是最优解,然而最优解我没看懂(捂脸),为什么用中位数求就是对的呢?:
1 | int minMoves2(vector<int>& nums) { |