517. 超级洗衣机
个人思路
官方题解:贪心
首先,计算洗衣机每个桶的平均值,如果无法求平均值返回-1。
然后,计算每个洗衣机与平均值的差值,为正表示需要移出,为负表示需要移入。
考虑前i个洗衣机差值之和,大于0表示前i个洗衣机需要向后面的洗衣机移出差值的衣服,小于0表示前i个洗衣机需要移入差值的衣服。
还要考虑前i个洗衣机内存在较大衣服的洗衣机,除了需要向后面洗衣机移出衣服,还要向前i个洗衣机内部移动衣服。
取两者最大值为答案
class Solution {
public:
int findMinMoves(vector<int>& machines) {
int sum=0;
for(int num:machines)
sum+=num;
if(sum%machines.size())
return -1;
int r=sum/machines.size();
sum=0;
int ans=0;
for(int num:machines){
num-=r;
sum+=num;
ans=max(ans,max(abs(sum),num));
}
return ans;
}
};
一些思考:
- 为什么计算前i个洗衣机的差值和?首先题目要求洗衣机只能向向相邻洗衣机移动衣服,如果前i个洗衣机的差值和大于0,需要将多的衣服移到右侧,由于只能相邻移动,每次必须将衣服移到第i个洗衣机,然后第i个洗衣机再移到右侧,所以需要的操作数是前i个洗衣机的差值。
- 为什么需要比较每个洗衣机的差值?如果洗衣机差值大于0,该洗衣机需要移出差值的衣物,在前i个洗衣机中如果某个洗衣机的衣物较多,除了移入右侧的洗衣机,还要平衡前i个洗衣机内部的衣物,所以操作数是该洗衣机的差值;而差值小于0的洗衣机无需考虑,因为该洗衣机可以接收多个洗衣机移入的衣物。