初学python记录:力扣1052. 爱生气的书店老板

文章讲述了如何帮助书店老板在一天营业中,通过有效地控制自己生气的时间,最大化让顾客感到满意的策略。通过比较不同时间段的顾客和老板生气状态,找到满足条件的最优方案。
摘要由CSDN通过智能技术生成

题目:

有一个书店老板,他的书店开了 n 分钟。每分钟都有一些顾客进入这家商店。给定一个长度为 n 的整数数组 customers ,其中 customers[i] 是在第 i 分钟开始时进入商店的顾客数量,所有这些顾客在第 i 分钟结束后离开。

在某些时候,书店老板会生气。 如果书店老板在第 i 分钟生气,那么 grumpy[i] = 1,否则 grumpy[i] = 0

当书店老板生气时,那一分钟的顾客就会不满意,若老板不生气则顾客是满意的。

书店老板知道一个秘密技巧,能抑制自己的情绪,可以让自己连续 minutes 分钟不生气,但却只能使用一次。

请你返回 这一天营业下来,最多有多少客户能够感到满意 。

提示:

  • n == customers.length == grumpy.length
  • 1 <= minutes <= n <= 2 * 104
  • 0 <= customers[i] <= 1000
  • grumpy[i] == 0 or 1

思考:

暴力解法:

遍历每一分钟,用数组sa记录满意的顾客数量,sa[x]表示老板从第x分钟开始抑制脾气,总共满意的顾客数量。那么sa[x] = 从x到x+minutes-1的所有顾客数 + 剩下的时间中grumpy为0时刻的顾客数,最后返回sa数组中最大的值即可,代码如下:

class Solution(object):
    def maxSatisfied(self, customers, grumpy, minutes):
        """
        :type customers: List[int]
        :type grumpy: List[int]
        :type minutes: int
        :rtype: int
        """
        n = len(customers)
        sa = [0 for _ in range(n-minutes+1)]
        ans = 0
        for i in range(n-minutes+1):
            for j in range(n):
                if i <= j <= i+minutes-1:
                    sa[i] += customers[j]
                elif grumpy[j] == 0:
                    sa[i] += customers[j]
            if sa[i] > ans:
                ans = sa[i]
        return ans

卡在了第 73 / 78 个例子:

优化:

 在计算sa[x]时,其实没必要遍历每分钟的顾客数和生气情况,因为和sa[x-1]相比,只有x-1分钟和i+minutes-1分钟的情况会影响sa[x],那么只需要判断这两个时刻的grumpy情况即可。另外,sa[0]需要首先单独计算出来。代码如下:

class Solution(object):
    def maxSatisfied(self, customers, grumpy, minutes):
        """
        :type customers: List[int]
        :type grumpy: List[int]
        :type minutes: int
        :rtype: int
        """
        n = len(customers)
        sa = [0 for _ in range(n-minutes+1)]
        for j in range(n):
            if 0 <= j <= minutes-1 or grumpy[j] == 0:
                sa[0] += customers[j]
        ans = sa[0]
        for i in range(1, n-minutes+1):
            if grumpy[i-1] == 0:
                if grumpy[i+minutes-1] == 0:
                    sa[i] = sa[i-1]
                else:
                    sa[i] = sa[i-1] + customers[i+minutes-1]
            else:
                if grumpy[i+minutes-1] == 0:
                    sa[i] = sa[i-1] - customers[i-1]
                else:
                    sa[i] = sa[i-1] - customers[i-1] + customers[i+minutes-1]
            if sa[i] > ans:
                ans = sa[i]
        return ans

提交通过:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值