517. 超级洗衣机
数学问题
思路:
将每个洗衣机中的衣服数量相等可以转化为:差值数组中每一项都变为0,差值数组为 diff[i] = machines[i] - target
在把差值数组每一项变为0的操作中,只需要求出其中所需移动衣服最多的洗衣机,就是最少的移动次数。
当diff[i] < 0 时,可以从左右两边的洗衣机获取衣服,取左右中的最大值;
当diff[i] > 0 时,需要把洗衣机的衣服向左右转移,此时移动次数等于diff[i]
我们从左向右依次把差值数组中的每一项变为0:考虑到与该洗衣机非相邻的洗衣机可能需要经过该洗衣机来转移衣服,因此
用balance记录当前洗衣机上所要经过的流量。
balance += diff[i];
balance < 0 说明需要从右边获取衣服,balance > 0 说明需要向右边转移衣服。
那么该洗衣机上的最大操作数为: max(diff[i], Math.abs(balance))
class Solution {
public:
int findMinMoves(vector<int>& machines) {
int n=machines.size();
int sum=accumulate(machines.begin(),machines.end(),0);
int count=0;
int balance=0;
if(sum%n==0)
{
int target=sum/n;
for(int i=0;i<n;i++)
{
balance+=machines[i]-target;
count=max(count,max(machines[i]-target,abs(balance)));
}
}
else
return -1;
return count;
}
};
附:还是不太理解这种思路!!!