LeetCode #462 Minimum Moves to Equal Array Elements II 最少移动次数使数组元素相等 II

462 Minimum Moves to Equal Array Elements II 最少移动次数使数组元素相等 II

Description:
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]

题目描述:
给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数,其中每次移动可将选定的一个元素加1或减1。 您可以假设数组的长度最多为10000。

示例 :

例如:

输入:
[1,2,3]

输出:
2

说明:
只有两个动作是必要的(记得每一步仅可使其中一个元素加1或减1):

[1,2,3]  =>  [2,2,3]  =>  [2,2,2]

思路:

找到中位数, 遍历数组求与中位数差的绝对值的和
使用排序之后再查找中位数时间复杂度O(nlgn)
快速排序时间复杂度O(n), 空间复杂度O(1)

代码:
C++:

class Solution 
{
public:
    int minMoves2(vector<int>& nums) 
    {
        int mid = helper(nums, 0, nums.size() - 1, nums.size() >> 1), result = 0;
        for (auto num : nums) result += abs(num - mid);
        return result;
    }
private:
    int helper(vector<int>& nums, int l, int r, int k)
    {
        if (l == r) return nums[l];
        int m = l + r >> 1, i = l;
        swap(nums[m], nums[r]);
        for (int j = l; j < r; j++) if (nums[j] < nums[r]) swap(nums[i++], nums[j]);
        swap(nums[i], nums[r]);
        return i == k ? nums[i] : (i > k ? helper(nums, l, i - 1, k) : helper(nums, i + 1, r, k));
    }
};

Java:

class Solution {
    public int minMoves2(int[] nums) {
        Arrays.sort(nums);
        int i = 0, j = nums.length - 1, result = 0;
        while (i < j) result += nums[j--] - nums[i++];
        return result;
    }
}

Python:

class Solution:
    def minMoves2(self, nums: List[int]) -> int:
        return sum(heapq.nlargest(len(nums) >> 1, nums)) - sum(heapq.nsmallest(len(nums) >> 1, nums))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容