力扣1052.爱生气的书店老板

有一个书店老板,他的书店开了 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] += 1s = [1, 0]
    • 此时 i < minutes - 1,执行 continue,跳过更新 max_s1
  • 第1分钟(i=1):

    • customers[1] = 0, grumpy[1] = 1
    • 老板烦躁,但没有顾客,s[1] += 0s = [1, 0]
    • 此时 i < minutes - 1,执行 continue,跳过更新 max_s1
  • 第2分钟(i=2):

    • customers[2] = 1, grumpy[2] = 0
    • 老板不烦躁,顾客自然满意,s[0] += 1s = [2, 0]
    • 此时 i = 2i 不再小于 minutes - 1,所以不再执行 continue,开始计算 max_s1

第一次执行 max_s1 = max(max_s1, s[1])

在第2分钟时,s[1] = 0(因为没有不满意的顾客),max_s1 初始值为 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白光白光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值