各位题友大家好! 今天是 @负雪明烛 坚持日更的第 30 天。今天力扣上的每日一题是「1052. 爱生气的书店老板」。

解题思路

重点:
- 不生气时顾客会留下,生气时会赶走顾客。
-「秘密技巧」可以使老板在窗口大小 X 的时间内不生气。我们的目标是:寻找一个时间长度为 X 的窗口,能留住更多的原本因为老板生气而被赶走顾客。
- 使用「秘密技巧」能得到的最终的顾客数 = 所有不生气时间内的顾客总数 + 在窗口 X 内使用「秘密技巧」挽留住的原本因为生气而被赶走顾客数。

因此,可以把题目分为以下两部分求解:
1. 所有不生气时间内的顾客总数:使用 $i$ 遍历$[0, customers.length)$,累加$grumpy[i] == 0$时的$customers[i]$。
2. 在窗口 X 内因为生气而被赶走的顾客数:使用大小为 X 的滑动窗口,累加滑动窗口内的$grumpy[i] == 1$时的$customers[i]$。

以题目示例 customers = [1,0,1,2,1,1,7,5], grumpy = [0,1,0,1,0,1,0,1], X = 3 为例说明:

代码

  1. class Solution:
  2. def maxSatisfied(self, customers: List[int], grumpy: List[int], X: int) -> int:
  3. N = len(customers)
  4. sum_ = 0
  5. # 所有不生气时间内的顾客总数
  6. for i in range(N):
  7. if grumpy[i] == 0:
  8. sum_ += customers[i]
  9. # 生气的 X 分钟内,会让多少顾客不满意
  10. curValue = 0
  11. # 先计算起始的 [0, X) 区间
  12. for i in range(X):
  13. if grumpy[i] == 1:
  14. curValue += customers[i]
  15. resValue = curValue
  16. # 然后利用滑动窗口,每次向右移动一步
  17. for i in range(X, N):
  18. # 如果新进入窗口的元素是生气的,累加不满意的顾客到滑动窗口中
  19. if grumpy[i] == 1:
  20. curValue += customers[i]
  21. # 如果离开窗口的元素是生气的,则从滑动窗口中减去该不满意的顾客数
  22. if grumpy[i - X] == 1:
  23. curValue -= customers[i - X]
  24. # 求所有窗口内不满意顾客的最大值
  25. resValue = max(resValue, curValue)
  26. # 最终结果是:不生气时的顾客总数 + 窗口X内挽留的因为生气被赶走的顾客数
  27. return sum_ + resValue

刷题心得


OK,以上就是 @负雪明烛 写的今天题解的全部内容了,如果你觉得有帮助的话,求赞、求关注、求收藏。如果有疑问的话,请在下面评论,我会及时解答。

关注我,你将不会错过我的精彩动画题解、面试题分享、组队刷题活动,进入主页 @负雪明烛 右侧有刷题组织,从此刷题不再孤单。

欢迎关注我的公众号:「每日算法题」。

祝大家牛年大吉!AC 多多,Offer 多多!我们明天再见!