本文主要是介绍leetcode 453. Minimum Moves to Equal Array Elements(C语言,又是一招出奇制胜)46,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
贴原题:
解析:
本题是给出一个数组,每次给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;//即每个数都减去最小值
}
这篇关于leetcode 453. Minimum Moves to Equal Array Elements(C语言,又是一招出奇制胜)46的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!