难度:★★★☆☆
类型:数组
方法:滑动窗口
题目
力扣链接请移步本题传送门
更多力扣中等题的解决方案请移步力扣中等题目录
今天,书店老板有一家店打算试营业 customers.length 分钟。每分钟都有一些顾客(customers[i])会进入书店,所有这些顾客都会在那一分钟结束后离开。
在某些时候,书店老板会生气。 如果书店老板在第 i 分钟生气,那么 grumpy[i] = 1,否则 grumpy[i] = 0。 当书店老板生气时,那一分钟的顾客就会不满意,不生气则他们是满意的。
书店老板知道一个秘密技巧,能抑制自己的情绪,可以让自己连续 X 分钟不生气,但却只能使用一次。
请你返回这一天营业下来,最多有多少客户能够感到满意的数量。
示例:
输入:customers = [1,0,1,2,1,1,7,5], grumpy = [0,1,0,1,0,1,0,1], X = 3
输出:16
解释:
书店老板在最后 3 分钟保持冷静。
感到满意的最大客户数量 = 1 + 1 + 1 + 1 + 7 + 5 = 16.
提示:
1 <= X <= customers.length == grumpy.length <= 20000
0 <= customers[i] <= 1000
0 <= grumpy[i] <= 1
解答
一看题目,是个一维数组的题目,出现【连续】二字,很容易想到使用滑动窗口来解决。
如果题目是这样,让求一个数组指定长度的连续子数组的最大和,我们很容易写出算法。大概会是这样,维护一个起点在i位置,长度为X的滑动窗口:
from typing import List
class Solution:
def maxSatisfied(self, customers: List[int], X: int) -> int:
s = sum(customers[:X])
ans = s
for i in range(len(customers)-X):
s += customers[X+i]
s -= customers[i]
ans = max(ans, s)
return ans
我们通过使用中间变量s来避免重复的加法运算。循环中每次执行的操作实际上是X+i位置处元素的加入以及i位置处元素的去除。
这道题增加了一个限制条件,也就是通过数组grumpy控制customers数组中相应数字的选择与否。因此在中间变量s的更新时,需要根据grumpy中相应的状态,来控制s更新的具体数值。
from typing import List
class Solution:
def maxSatisfied(self, customers: List[int], grumpy: List[int], X: int) -> int:
s = sum(c for i, (c, g) in enumerate(zip(customers, grumpy)) if g == 0 or i < X)
ans = s
for i in range(len(customers)-X):
s += customers[X+i] if grumpy[X+i] else 0
s -= customers[i] if grumpy[i] else 0
ans = max(ans, s)
return ans
如有疑问或建议,欢迎评论区留言~
有关更多力扣中等题的python解决方案,请移步力扣中等题解析