1052. 爱生气的书店老板(Python)

难度:★★★☆☆
类型:数组
方法:滑动窗口

题目

力扣链接请移步本题传送门
更多力扣中等题的解决方案请移步力扣中等题目录

今天,书店老板有一家店打算试营业 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解决方案,请移步力扣中等题解析

你可能感兴趣的:(1052. 爱生气的书店老板(Python))