目录
一、题目
1、题目描述
有一个书店老板,他的书店开了
n
分钟。每分钟都有一些顾客进入这家商店。给定一个长度为n
的整数数组customers
,其中customers[i]
是在第i
分钟开始时进入商店的顾客数量,所有这些顾客在第i
分钟结束后离开。在某些时候,书店老板会生气。 如果书店老板在第
i
分钟生气,那么grumpy[i] = 1
,否则grumpy[i] = 0
。当书店老板生气时,那一分钟的顾客就会不满意,若老板不生气则顾客是满意的。
书店老板知道一个秘密技巧,能抑制自己的情绪,可以让自己连续
minutes
分钟不生气,但却只能使用一次。请你返回 这一天营业下来,最多有多少客户能够感到满意 。
2、接口描述
python3
class Solution:
def maxSatisfied(self, customers: List[int], grumpy: List[int], minutes: int) -> int:
cpp
class Solution {
public:
int maxSatisfied(vector<int>& customers, vector<int>& grumpy, int minutes) {
}
};
3、原题链接
二、解题报告
1、思路分析
我们统计出客人总和s1,每个事件点不满意的客人数目cnt[i],cnt的和为s2
在cnt[]上维护一个长度为minute的滑动窗口,看最多能让多少不满意的变满意,记为res
答案就是s1 - s2 + res
2、复杂度
时间复杂度:O(n) 空间复杂度:O(n)
3、代码详解
python3
class Solution:
def maxSatisfied(self, customers: List[int], grumpy: List[int], minutes: int) -> int:
n = len(customers)
cnt = [0] * n
for i, x in enumerate(customers):
if grumpy[i]:
cnt[i] += x
l, r, s = 0, -1, 0
res = 0
while r < n - 1:
r += 1
s += cnt[r]
if r - l + 1 > minutes:
s -= cnt[l]
l += 1
res = max(res, s)
return sum(customers) - sum(cnt) + res
cpp
class Solution {
public:
int maxSatisfied(vector<int>& customers, vector<int>& grumpy, int minutes) {
int n = customers.size();
vector<int> cnt(n);
int s1 = 0, s2 = 0;
for(int i = 0; i < n; i ++) {
s1 += customers[i];
if(grumpy[i])
s2 += customers[i], cnt[i] += customers[i];
}
int l = 0, r = -1, s = 0, res = 0;
while(r < n - 1){
s += cnt[ ++ r];
if(r - l + 1 > minutes) s -= cnt[l ++];
res = max(res, s);
}
return s1 - s2 + res;
}
};