462. 最少移动次数使数组元素相等 II

462. 最少移动次数使数组元素相等 II

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

例如:

输入:
[1,2,3]

输出:
2

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-moves-to-equal-array-elements-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

这个题目的大概意思就是我们从一个数组中找到一个数字,使所有的数字进行加1或者减1之后都等于这个数字,并且进行使进行加减的次数最少。

假设这个数组的最大数字为y,最小数字为x,题目要求找到的那个数字为 i ,我们可以很容易的知道,最大的数字和最小的数字都不可能是我们要找的那个数字,因为这不可能构成最小的移动次数,(y - i) + (i - x) = y - x.通过这一个式子我们可以知道,进行移动的次数和 i 的值没有任何关系,当把x不断加1,y不断减1,使之最后和 i 的值相等的时候,这个时候我们就把x和y从要数组中移除,其实就是把数组的范围给缩小的,然后从缩小的范围之后进行查找最小移动的次数,假设i不是中位数,那么在范围不断缩小的过程中, i 很有可能成为那个最大或者最小的值,而我们可以很轻易的判断出,i不可能是最大或者最小值,所以 i 肯定就是中位数.

        既然我们从上面的推测中知道了最后我们要找的数字i就是中位数,而且所需要移动的最小次数和 i 没有任何关系,我们就可以直接进行编程计算了。

        下面是java代码

         class Solution {
    public int minMoves2(int[] nums) {
        Arrays.sort(nums);
        int sum = 0;
        int x = 0;
        int y = nums.length-1;
        while (x < y) {
            sum+=nums[y] - nums[x];
            y--;
            x++;
        }
        return sum;
    }
}

 

                         462. 最少移动次数使数组元素相等 II_第1张图片

你可能感兴趣的:(java,462.,最少移动次数使数组元素相等,II,leetcode,java,leetcode,462.,最少移动次数使数组元素相等,II,算法)