有一个书店老板,他的书店开了 n
分钟。每分钟都有一些顾客进入这家商店。给定一个长度为 n
的整数数组 customers
,其中 customers[i]
是在第 i
分钟开始时进入商店的顾客数量,所有这些顾客在第 i
分钟结束后离开。
在某些分钟内,书店老板会生气。 如果书店老板在第 i
分钟生气,那么 grumpy[i] = 1
,否则 grumpy[i] = 0
。
当书店老板生气时,那一分钟的顾客就会不满意,若老板不生气则顾客是满意的。
书店老板知道一个秘密技巧,能抑制自己的情绪,可以让自己连续 minutes
分钟不生气,但却只能使用一次。
请你返回 这一天营业下来,最多有多少客户能够感到满意 。
示例 1:
输入:customers = [1,0,1,2,1,1,7,5], grumpy = [0,1,0,1,0,1,0,1], minutes = 3 输出:16 解释:书店老板在最后 3 分钟保持冷静。 感到满意的最大客户数量 = 1 + 1 + 1 + 1 + 7 + 5 = 16.
示例 2:
输入:customers = [1], grumpy = [0], minutes = 1 输出:1
提示:
n == customers.length == grumpy.length
1 <= minutes <= n <= 2 * 104
0 <= customers[i] <= 1000
grumpy[i] == 0 or 1
思路:
例如数组 customers=[3,1,4,1,5,9] 和 minutes=3,假设老板一直在生气:
计算第一个长为 3 的子数组的元素和 3+1+4=8。
计算第二个长为 3 的子数组的元素和,我们可以在第一个子数组元素和的基础上,增加 customers[3]=1,减少 customers[0]=3,得到 8+1−3=6。
计算第三个长为 3 的子数组的元素和,我们可以在第二个子数组元素和的基础上,增加 customers[4]=5,减少 customers[1]=1,得到 6+5−1=10。
计算第四个长为 3 的子数组的元素和,我们可以在第三个子数组元素和的基础上,增加 customers[5]=9,减少 customers[2]=4,得到 10+9−4=15。
最大的长为 3 的子数组和为 15。
class Solution:
def maxSatisfied(self, customers: List[int], grumpy: List[int], minutes: int) -> int:
s = [0,0] #s[0]用于记录老板不烦躁状态,s[1]用来记录老板的烦躁状态
max_s1 = 0 #记录老板烦躁时的最大值
for i,(c,g) in enumerate(zip(customers,grumpy)): #返回索引i(0,1...),将c,g 打包并且计数
s[g] += c # s[g] 通过 g 来决定更新的是满意顾客数量(s[0])还是不满意顾客数量(s[1])
if i <minutes-1: #窗口长度不足minutes,第一次执行时,如果i小于2,则跳过后面语句
continue
max_s1 = max(max_s1,s[1]) #通过比较选出最大的烦躁状态顾客数
if grumpy[i - minutes+1]: #即当老板烦躁时,即数组内为1
s[1] -=customers[i-minutes+1] # 如果滑动窗口的起点老板是烦躁状态,则减少 s[1] 的不满意顾客数
return s[0]+max_s1
代码举例:
对于输入:对于[1,0,1,2,1,1,7,5] ;grumpy = [0,1,0,1,0,1,0,1] ;minutes = 3
具体计算:
-
第0分钟(i=0):
customers[0] = 1
,grumpy[0] = 0
- 老板不烦躁,顾客自然满意,
s[0] += 1
,s = [1, 0]
- 此时
i < minutes - 1
,执行continue
,跳过更新max_s1
。
-
第1分钟(i=1):
customers[1] = 0
,grumpy[1] = 1
- 老板烦躁,但没有顾客,
s[1] += 0
,s = [1, 0]
- 此时
i < minutes - 1
,执行continue
,跳过更新max_s1
。
-
第2分钟(i=2):
customers[2] = 1
,grumpy[2] = 0
- 老板不烦躁,顾客自然满意,
s[0] += 1
,s = [2, 0]
- 此时
i = 2
,i
不再小于minutes - 1
,所以不再执行continue
,开始计算max_s1
。
第一次执行 max_s1 = max(max_s1, s[1])
:
在第2分钟时,s[1] = 0
(因为没有不满意的顾客),max_s1
初始值为 0
。