[leetcode] 517. Super Washing Machines


这道题是为洗衣机阵列做负载均衡,题目难度为Hard。

如果衣服总数不能被洗衣机总数整除,表明不能均分所有衣服,返回-1;如果能整除,拿avg表示最终每个洗衣机中衣服数。

如果我们能够得到任意位置k上洗衣机最少需要的操作数,则遍历整个数组即可得到最终需要的最小操作数,因为所有位置互不相关,可以同时进行操作。

​对位置k上的洗衣机来说,如果左边k个洗衣机中(下标从0开始)原有衣服总数小于avg*k,表明左边k个洗衣机作为整体最终需要从右边洗衣机(包含位置k)中获取衣服,而获取衣服必定需要通过位置k的洗衣机,右边同理。这里拿lCnt表示位置k左边所有洗衣机最终向右边洗衣机(包含位置k)输送的衣服数,如果lCnt小于0,表示左边洗衣机最终需要从右边洗衣机中获取衣服,同理拿rCnt表示位置k右边所有洗衣机最终向左边洗衣机(包含位置k)中输送的衣服数。lCnt和rCnt在知道了avg之后很容易计算,这样通过判断lCnt和rCnt的正负即可得出位置k上洗衣机的最小操作数。

  • 如果lCnt>0 && rCnt>0

​表明位置k需要同时从两侧获取衣服,两侧可以同时进行,所以位置k上最小操作数为max(lCnt, rCnt);

  • 如果lCnt<0 && rCnt<0

表明位置k同时向两侧输出衣服,两侧不能同时进行,所以位置k上最小操作数为-lCnt-rCnt;

  • 其他情况

表明位置k需要从一侧获取衣服,然后向另一侧输出衣服,两侧可以同时进行,所以位置k上最小操作数为max(abs(lCnt), abs(rCnt))。

遍历整个数组即可比较得出最终的最小操作次数。具体代码:


  1. class Solution {  
  2. public:  
  3.     int findMinMoves(vector<int>& machines) {  
  4.         if(machines.empty()) return 0;  
  5.         int n = machines.size(), minMv = INT_MIN, avg;  
  6.         vector<int> sum(n+1, 0);  
  7.           
  8.         for(int i=0; i<n; ++i)  
  9.             sum[i+1] = sum[i] + machines[i];  
  10.         if(sum.back() % n) return -1;  
  11.         avg = sum.back() / n;  
  12.           
  13.         for(int i=0; i<n; ++i) {  
  14.             int lCnt = sum[i] - avg * i;  
  15.             int rCnt = sum.back() - sum[i+1] - avg * (n - 1 - i);  
  16.             if(lCnt > 0 && rCnt > 0)  
  17.                 minMv = max(minMv, max(lCnt, rCnt));  
  18.             else if(lCnt < 0 && rCnt < 0)  
  19.                 minMv = max(minMv, 0 - lCnt - rCnt);  
  20.             else  
  21.                 minMv = max(minMv, max(abs(lCnt), abs(rCnt)));  
  22.         }  
  23.           
  24.         return minMv;  
  25.     }  
  26. };  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值