LeetCode 517 超级洗衣机(贪心)
这道题给出了初始每个洗衣机内的衣服,每一次操作可将任意个洗衣机内的一件衣服移到相邻的一台洗衣机内,问每台洗衣机内的衣服经过多次操作后是否可以相等,如果可以,那么最少操作步骤是多少。这道题用的方法很巧妙,时间复杂度只需要O(n),具体方法是首先计算出是否可以给每台洗衣机分配相等的衣服,如果可以就继续计算出每台洗衣机最终的衣服数量P,然后用当前数组减去P得出每台洗衣机需要的衣服或者多余的衣服,并且统计出多余衣服的最大值ans1(这里只统计多余的是因为一个洗衣机每次最多只能给出一件衣服,但是最多可以接收两件衣服,所以接收衣服的次数无法准确得出)。然后从第一个洗衣机开始计算当前需要还是多余的衣服数,然后计算第二个,因为这里无论第一个洗衣机多余衣服还是需要衣服都需要经过第二个洗衣机,第三个洗衣机相对于第二个也是同理,把数组种第一个的值加在第二个上面就是第二个洗衣机需要或者多余的衣服数,统计每次处理后数组绝对值的最大值ans2,最终答案就是ans1和ans2中的最大值。具体可见————解题方法。
class Solution {
public:
int findMinMoves(vector<int>& machines) {
int sum=0,sz=machines.size();
for(int i=0;i<sz;i++)
sum+=machines[i];
if(sum%sz!=0) return -1;
int per=sum/sz;
int ans=0;
for(int i=0;i<sz;i++)
{
machines[i]-=per;
if(machines[i]>0) ans=max(ans,machines[i]);
}
for(int i=1;i<sz;i++)
{
machines[i]+=machines[i-1];
ans=max(ans,abs(machines[i]));
}
return ans;
}
};