贴原题:
解析:
本题是给出一个数组,每次给n-1个小于等于最大值的数增加1,直到所有的数都相等为止,最后返回加1的次数。
常规的算法是不可能行得通了,这辈子都不可能行得通了,只有靠出奇制胜才能Accepted这样子。
出奇制胜的逆向思维:每次小于最大值的数都加1,那么就相当于最大的那个数减去1,直到所有的数都减到和最小值相等为止——
[1,2,3] => [1,2,2] => [1,2,1] => [1,1,1]
那么,我们只需要把每个数都减去最小值便可以得到每个数减的次数。以上例,[1,2,3]的最小值是1,那么1移动的次数应该是1-1=0,2移动的次数是2-1=1,3移动的次数是3-1=2。一共移动的次数即为0+1+2=3。
贴C代码:
int minMoves(int* nums, int numsSize) {
int min=*nums;//数组中的最小值
int sum=0;//数组累加和
for(int i=0; i<numsSize; i++)
{
min=*(nums+i)<min?*(nums+i):min;//找出最小值
sum += *(nums+i);//计算数组累加和
}
return sum-numsSize*min;//即每个数都减去最小值
}