题解

滑动窗口问题。
先计算未生气时间段的顾客总数,
然后使用长度为X的窗口从左向右滑动,
滑动过程中加上右侧生气损失的顾客,
减去左侧生气损失的顾客,
并记录最大值即可。

代码

  1. /**
  2. * @param {number[]} customers
  3. * @param {number[]} grumpy
  4. * @param {number} X
  5. * @return {number}
  6. */
  7. var maxSatisfied = function(customers, grumpy, X) {
  8. // 计算未生气时间段的顾客总数
  9. let sum = customers.reduce((prv, cur, idx) => grumpy[idx] ? prv : prv + cur, 0)
  10. let ret = 0
  11. for (let i = 0, prv; i < customers.length; i++) {
  12. prv = i - X
  13. // 加上右侧生气损失的顾客
  14. if (grumpy[i]) sum += customers[i]
  15. // 减去左侧生气损失的顾客
  16. if (prv >= 0 && grumpy[prv]) sum -= customers[prv]
  17. ret = Math.max(ret, sum)
  18. }
  19. return ret
  20. };