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;
}
}