LeetCode-Python-1052. 爱生气的书店老板

    xiaoxiao2024-12-12  16

    今天,书店老板有一家店打算试营业 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 <= 200000 <= customers[i] <= 10000 <= grumpy[i] <= 1  

    思路:

    看到了位置可选的长度为X的一个区间,马上要想到sliding window。

    先计算一下假设没有这个不生气BUFF时候每一个长度为X的区间上,可以让多少顾客满意,值为angsum。

    再计算有了这个不生气BUFF,在每一个长度为X的区间上,有多少顾客满意,值为presum。

    所以对于每个区间,因为这个BUFF而新增的满意顾客数就是presum - angsum,求这个值的最大值即可。

    区间和的计算可以用前缀和数组加快计算速度。

    class Solution(object): def maxSatisfied(self, customers, grumpy, X): """ :type customers: List[int] :type grumpy: List[int] :type X: int :rtype: int """ record = [0 for _ in range(len(grumpy))] #代表在i满意的顾客总数 s = 0 for i in range(len(grumpy)): if grumpy[i] == 0: record[i] += record[i - 1] + customers[i] else: record[i] += record[i - 1] print record tmp = record[-1]#不生气的时候已经可以满足的 prefix = [0 for _ in range(len(grumpy))] prefix[0] = customers[0] for i in range(1, len(grumpy)): prefix[i] += prefix[i - 1] + customers[i] lo, hi = 0, X - 1 newcus = 0 # print prefix while(hi < len(grumpy)): if lo == 0: presum = prefix[hi] - 0 #上了BUFF之后的 angsum = record[hi] - 0 #没上BUFF else: presum = prefix[hi] - prefix[lo - 1] angsum = record[hi] - record[lo - 1] earn = presum - angsum # print presum, angsum, earn, hi newcus = max(presum - angsum, newcus) hi += 1 lo += 1 return tmp + newcus

     

    最新回复(0)