滑动窗口---6(稍难)

1052. 爱生气的书店老板

题目来源:1052. 爱生气的书店老板 - 力扣(LeetCode)

 分析:

  1. 求不生气的时间最多顾客数量
  2. 将原始本来就不生气的时间内所有顾客累加 res 
  3. 通过滑动grumpy来获取,在连续minutes时间内不生气导致的满意顾客增量 ans
  4. 最后 res += ans即时结果

答案:

class Solution:
    def maxSatisfied(self, customers: List[int], grumpy: List[int], minutes: int) -> int:
        '''
        customers = [1,0,1,2,1,1,7,5], 
        grumpy =    [0,1,0,1,0,1,0,1], 
        minutes =   3
        遍历grumpy 滑动长度为3窗口  求生气窗口最大增值 
        所有不生气的时间都顾客数量 加上 最大增值 即时最后结果
        '''
        # 增值 
        ans = ans_tmp = 0
        left = 0
        res = 0
        for right,gru in enumerate(grumpy):
            # -----> 移入
            if gru == 0:
                res += customers[right]  # 加和所有不生气的人数
            # 计算窗口增值
            if gru == 1:
                ans_tmp += customers[right]
            left = right + 1 - minutes
            if left < 0 :
                continue
            # 更新增值  以及对应的窗口左端点 作为该窗口标识
            if ans < ans_tmp:
                ans = max(ans,ans_tmp)
            # -----------> 移除
            if grumpy[left] == 1:
                tmp = customers[left]
                ans_tmp -= tmp
        res += ans
        return res

灵神:

class Solution:
    def maxSatisfied(self, customers: List[int], grumpy: List[int], minutes: int) -> int:
        s = [0, 0]
        max_s1 = 0
        for i, (c, g) in enumerate(zip(customers, grumpy)):
            s[g] += c
            if i < minutes - 1:  # 窗口长度不足 minutes
                continue
            max_s1 = max(max_s1, s[1])
            if grumpy[i - minutes + 1]:
                s[1] -= customers[i - minutes + 1]  # 窗口最左边元素离开窗口
        return s[0] + max_s1

作者:灵茶山艾府

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值