各位题友大家好! 今天是 @负雪明烛 坚持日更的第 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
为例说明:
代码
class Solution:
def maxSatisfied(self, customers: List[int], grumpy: List[int], X: int) -> int:
N = len(customers)
sum_ = 0
# 所有不生气时间内的顾客总数
for i in range(N):
if grumpy[i] == 0:
sum_ += customers[i]
# 生气的 X 分钟内,会让多少顾客不满意
curValue = 0
# 先计算起始的 [0, X) 区间
for i in range(X):
if grumpy[i] == 1:
curValue += customers[i]
resValue = curValue
# 然后利用滑动窗口,每次向右移动一步
for i in range(X, N):
# 如果新进入窗口的元素是生气的,累加不满意的顾客到滑动窗口中
if grumpy[i] == 1:
curValue += customers[i]
# 如果离开窗口的元素是生气的,则从滑动窗口中减去该不满意的顾客数
if grumpy[i - X] == 1:
curValue -= customers[i - X]
# 求所有窗口内不满意顾客的最大值
resValue = max(resValue, curValue)
# 最终结果是:不生气时的顾客总数 + 窗口X内挽留的因为生气被赶走的顾客数
return sum_ + resValue
刷题心得
OK,以上就是 @负雪明烛 写的今天题解的全部内容了,如果你觉得有帮助的话,求赞、求关注、求收藏。如果有疑问的话,请在下面评论,我会及时解答。
关注我,你将不会错过我的精彩动画题解、面试题分享、组队刷题活动,进入主页 @负雪明烛 右侧有刷题组织,从此刷题不再孤单。
欢迎关注我的公众号:「每日算法题」。
祝大家牛年大吉!AC 多多,Offer 多多!我们明天再见!