leetcode-453. Minimum Moves to Equal Array Elements

453. Minimum Moves to Equal Array Elements

Given a non-empty integer array of size n, find the minimum number of moves required to make all array elements equal, where a move is incrementing n - 1 elements by 1.

Example:

Input:
[1,2,3]

Output:
3

Explanation:
Only three moves are needed (remember each move increments two elements):

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


题意:

给定一个非空数组,长度为 n,定义一种移动操作,每次可以将 n-1 的个元素加 1,求最少次的移动,是所有元素都相等


题解:

我也是看了discuss的,其实是一个数学问题。 首先,每次肯定都要将前 n-1 个较小的元素加 1 !

大致意思是:

定义 sum 为数组所有元素的和,minNum 为最小元素, n 为数组长度, 所求最小移动次数为 m  ,移动 m 次后所有元素的值都是 x


  • 首先有   sum + m*( n - 1) = x * n  ,(这个好理解,m次移动,每次都能加  n-1  ,最后的值都是 x,共有 n 个)
  • 其次有    x = minNum + m (最终的元素值为 x ,最小值每次都要 “移动“” 的 )
  • 两个方程联立,就能求出      m = sum - n * minNum   ,这就是所求的了。


附上代码:

class Solution {
    public int minMoves(int[] nums) {
        Arrays.sort(nums);
        int  sum = 0;
        for(int i = 0;i<nums.length;i++)
            sum+=nums[i];       
        return  sum - nums.length*nums[0];
    }
}


posted @ 2017-11-12 10:28  link98  阅读(114)  评论(0编辑  收藏  举报