LeetCode 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]
class Solution {
public:
    int minMoves(vector<int>& nums) {
        int minval=*min_element(nums.begin(),nums.end());
        int sum=accumulate(nums.begin(),nums.end(),0);
        return sum-nums.size()*minval;
        //分析如下:
          首先题目的意思是每次move,相当于选nums里nums.size()-1个数加1,然后不停的执行move,直到nums里的数都相等;
          先来分析一下,不管每次怎么move,被选中要加一的数里一定含有最小的那个数,如若不然,就是加1的数里没有最小的那个,其他的数本来就比它大了,加1后就更           大了,要求是最少的move次数,所以必须每次move中要加1的数里含有最小的那个数。
          设最后每个数都是m。 一开始nums中最小的数是minval, nums的和是sum。cnt是move的次数
          每次move,相当于sum加nums.size()-1。
          于是最后根据每个数相等 有方程:
              nums.size()*m=sum+cnt*(nums.size()-1),  
          又每次move加1里都有minval,所以move的次数cnt=m-minval.
          可以解出 cnt=sum-nums.size()*minval;
        
    }
};
posted @ 2018-12-04 21:20  A-Little-Nut  阅读(114)  评论(0编辑  收藏  举报