Leet453. Minimum Moves to Equal Array Elements

Posted wuezs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leet453. Minimum Moves to Equal Array Elements相关的知识,希望对你有一定的参考价值。

题目链接:https://leetcode.com/problems/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]


思路:

因为最后每个数都相等设为X,sum是开始数组和,n是数组长度,所以有公式:n*X=sum+(n-1)*k,即求k,一个自然的想法是 递增k,计算sum+(n-1)*k,找到第一个sum+(n-1)*k能被n整数的数,就得到k了。   不过这有问题,实际上sum初始值不同,得到的k也不同,而这种解法得到的k是相同的。

睡觉前终于想出解法了O(∩_∩)O~   因为每个数都会经历递增的过程,最后达到一个ceiling。假设数组元素最终为X,数组最小元素min需要经过X-min次增长,最大元素max需要经过X-max次增长,(X-min)-(X-max)=max-min就是max不变  其余元素包括min 增长的次数,经过这些次增长后,min元素和max元素大小相等,且它俩成为当前数组最小元素。   然后我们再让这俩最小元素增长到当前数组最大元素(初始数组次最大元素max2)的大小,增长的次数是max2-min,最终使得这三个元素相等。每一次增长都让数组中大小相同的元素增加一个,从1到2到3~~~n,故总共增加了max-min,max2(初始数组次最大元素)-min,max3-min,,,总和就是sum-min*n


算法:

    public int minMoves(int[] nums) 
        int min= Integer.MAX_VALUE;
        int sum = 0;
    	for(int n:nums)
        	min = Math.min(min, n);
        	sum+=n;
        
    	return sum-nums.length*min;
    



以上是关于Leet453. Minimum Moves to Equal Array Elements的主要内容,如果未能解决你的问题,请参考以下文章

453. Minimum Moves to Equal Array Elements

453 Minimum Moves to Equal Array Elements

leetcoode刷题 453. Minimum Moves to Equal Array Elements

453. Minimum Moves to Equal Array Elements

LeetCode 453. Minimum Moves to Equal Array Elements

453. Minimum Moves to Equal Array Elements