题目:
有一个书店老板,他的书店开了 n
分钟。每分钟都有一些顾客进入这家商店。给定一个长度为 n
的整数数组 customers
,其中 customers[i]
是在第 i
分钟开始时进入商店的顾客数量,所有这些顾客在第 i
分钟结束后离开。
在某些时候,书店老板会生气。 如果书店老板在第 i
分钟生气,那么 grumpy[i] = 1
,否则 grumpy[i] = 0
。
当书店老板生气时,那一分钟的顾客就会不满意,若老板不生气则顾客是满意的。
书店老板知道一个秘密技巧,能抑制自己的情绪,可以让自己连续 minutes
分钟不生气,但却只能使用一次。
请你返回 这一天营业下来,最多有多少客户能够感到满意 。
提示:
n == customers.length == grumpy.length
1 <= minutes <= n <= 2 * 104
0 <= customers[i] <= 1000
grumpy[i] == 0 or 1
思考:
暴力解法:
遍历每一分钟,用数组sa记录满意的顾客数量,sa[x]表示老板从第x分钟开始抑制脾气,总共满意的顾客数量。那么sa[x] = 从x到x+minutes-1的所有顾客数 + 剩下的时间中grumpy为0时刻的顾客数,最后返回sa数组中最大的值即可,代码如下:
class Solution(object):
def maxSatisfied(self, customers, grumpy, minutes):
"""
:type customers: List[int]
:type grumpy: List[int]
:type minutes: int
:rtype: int
"""
n = len(customers)
sa = [0 for _ in range(n-minutes+1)]
ans = 0
for i in range(n-minutes+1):
for j in range(n):
if i <= j <= i+minutes-1:
sa[i] += customers[j]
elif grumpy[j] == 0:
sa[i] += customers[j]
if sa[i] > ans:
ans = sa[i]
return ans
卡在了第 73 / 78 个例子:
优化:
在计算sa[x]时,其实没必要遍历每分钟的顾客数和生气情况,因为和sa[x-1]相比,只有x-1分钟和i+minutes-1分钟的情况会影响sa[x],那么只需要判断这两个时刻的grumpy情况即可。另外,sa[0]需要首先单独计算出来。代码如下:
class Solution(object):
def maxSatisfied(self, customers, grumpy, minutes):
"""
:type customers: List[int]
:type grumpy: List[int]
:type minutes: int
:rtype: int
"""
n = len(customers)
sa = [0 for _ in range(n-minutes+1)]
for j in range(n):
if 0 <= j <= minutes-1 or grumpy[j] == 0:
sa[0] += customers[j]
ans = sa[0]
for i in range(1, n-minutes+1):
if grumpy[i-1] == 0:
if grumpy[i+minutes-1] == 0:
sa[i] = sa[i-1]
else:
sa[i] = sa[i-1] + customers[i+minutes-1]
else:
if grumpy[i+minutes-1] == 0:
sa[i] = sa[i-1] - customers[i-1]
else:
sa[i] = sa[i-1] - customers[i-1] + customers[i+minutes-1]
if sa[i] > ans:
ans = sa[i]
return ans
提交通过: