453. Minimum Moves to Equal Array Elements

453. Minimum Moves to Equal Array Elements IIarrow-up-right

Given an integer array nums of size n, return the minimum number of moves required to make all array elements equal.

In one move, you can increment n - 1 elements of the array by 1.

Example 1:

Input: nums = [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]

Example 2:

Input: nums = [1,1,1]
Output: 0

Constraints:

  • n == nums.length

  • 1 <= nums.length <= 105

  • -109 <= nums[i] <= 109

  • The answer is guaranteed to fit in a 32-bit integer.

My Solutions:

给一个长度为n的数组,每次可以对 n-1 个数字同时加1,问最少需要多少次这样的操作才能让数组中所有的数字相等。--> 每次给除了数组最大值的所有数字加1能快速的到达平衡状态。但是这道题如果每次找出最大值,然后给其他数字加1,再判断是否平衡,思路是正确,但是时间溢出。

换一个角度来看问题,给 n-1 个数字加1,效果等同于给那个未被选中的数字减1,比如数组 [1,2,3],给除去最大值的其他数字加1,变为 [2,3,3],全体减1,并不影响数字间相对差异,变为 [1,2,2],这个结果其实就是原始数组的最大值3自减1。那么问题也可能转化为,将所有数字都减小到最小值。只要先找到最小值,然后累加每个数跟最小值之间的差值即可。

这个问题还可以转化成求出数组的数字之和 sum,然后用 sum 减去最小值和数组长度的乘积,得到的就是sum和如果全部element都是最小值的差值。这个差值就是需要移动的步数。

Last updated