美文网首页
1052. 爱生气的书店老板(Python)

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

作者: 玖月晴 | 来源:发表于2021-07-26 14:58 被阅读0次

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

    题目

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

    今天,书店老板有一家店打算试营业 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)

          本文链接:https://www.haomeiwen.com/subject/wngvkltx.html