https://leetcode.com/problems/super-washing-machines/
该题目会给出一个数组,然后让它的所有元素都转化为它们的平均值。要求每次进行转换时,只能是某个元素往相邻的一个元素给出1.一次操作时,每个元素都允许同时进行最多一次的操作,问最少的操作数。
首先先判断能否取平均数,即构建一个向量,向量的每一项都是上一项与该项对应的数组元素之和,即这个向量的最后一项就是所有元素之和。用它来判断出是否有平均数并且求出该平均数后,可以对向量的每一位进行如下比较:首先,将该位的值与对应的平均数(即平均数x该值)进行比较。根据题意可知,如果对应平均数小于该位,那就意味着该元素要向其左边的元素转移,转移的次数即是这个差值。这便是左移;其次,将数组的最后一位元素(即总和)减去该元素后,再比较平均数。如果对应平均数大于这个差值,那就意味着需要右移,与之前的相反。
此时便求出了要让该元素归位所需的左移和右移数。考虑到两者可以同时在一个元素上进行,因此求出其所需的移动数,即将两者相加。在上面算出的左移和右移数有正有负,若为负数即说明是反方向移动,即我们要将对应的元素全部左移或右移。此时即比较两者绝对值的大小,取较大的一方。之后,将算出来的数与当前的结果进行比较,如果算出来的数更大则将其写入结果,这样即完成了一次比较。如此类推,将所有的元素比较完成,所得的最终结果即为所求。