leetcode 453. Minimum Moves to Equal Array Elements(C语言,又是一招出奇制胜)46

来源:互联网 发布:中国也门撤侨事件 知乎 编辑:程序博客网 时间:2024/05/29 16:52

贴原题:
这里写图片描述

解析:
  本题是给出一个数组,每次给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;//即每个数都减去最小值}
阅读全文
0 0