【LeetCode】453.Minimum Moves to Equal Array Elements

Posted by kyle on February 25, 2019

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

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

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

一直以来都没有写解题报告的习惯,但是遇到这一题还是觉得有必要好好总结一下。主要两方面的原因。

一是,碰到这题的时候,突然觉得自己思维固化得严重,之前刷的题大部分都是靠逻辑推理下就可以了,这道题完全是一道数学公式推导题,一下子逻辑转不过弯来。

二是,长期以来我一直采取的是“龟系”的刷题方法,刷题效率提不上去不说,还经常折磨得自己头疼。现在越来越觉得精力有限,而且发现有时想不通的题,其实可以放一放,隔一段时间就想通了。

介于此,这道题是我转变思维的分水岭,我决定从今天开始尝试“兔系”刷题法。

下面切回正题。

假设加t次,最终每个值都为y,原始数组各项之和为S

则有:

式一:

接下来还有一个公式则不是那么直观。对于原始数组中的最小值(假设为min),在我们不断地将(n - 1)项加至y的过程中,必然都包含最小值这一项。(关于这一点,我还没找到严格的数学证明,只是从直觉上感觉是这样的,等我想到了再来补充。)

于是推导出,式二:

联立式一、式二,得:

代码如下:

public class MinimumMovesToEqualArrayElements {
    public int minMoves(int[] nums) {
        int min = nums[0];
        for (int num : nums) {
            min = Math.min(min, num);
        }
        int t = 0;
        for (int num : nums) {
            t += num - min;
        }
        return t;
    }
}