Minimum Moves to Equal Array Elements II最小移动步数问题解法详解

来源:互联网 发布:3d雕塑软件 编辑:程序博客网 时间:2024/06/03 08:36

问题详见: 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:

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,0,0,8,6]这样的数其平均数为3,按平均数移动需要2+3+3+5+3=16步,然而如果按照中位数1的话则只需0+1+1+7+5=14步,所以该题是按照中位数计算最小移动步数。所以只需查找到中位数即可很方便求出答案,整个算法复杂度为O(n)。具体算法如下:

class Solution {public:    int minMoves2(vector<int>& nums) {        int n = nums.size();        auto it = nums.begin() + n/2;        nth_element(nums.begin(), it, nums.end());        int median = *it;        int total = 0;        for (auto &i : nums)            total += abs(i-median);        return total;    }};

其提交运行结果如下:
Minimum Moves to Equal Array Elements II

0 0
原创粉丝点击