1、描述
1052今天,书店老板有一家店打算试营业 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.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/grumpy-bookstore-owner
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2、关键字
数组,数组元素对应的属性,
3、思路
滑动窗口、
情况二分:把结果集分成两部分:一开始就注定的顾客+滑动窗口中挽留的顾客。(不是分成滑动窗口内部和外部!)
4、notes
把问题分成两部分,遍历两次就好了,和之前一个字节的题目一样的思路
滑动窗口初始化之后再封信
5、复杂度
时间:O(N)
空间:O(1)
6、code
class Solution {
public:
int maxSatisfied(vector<int>& customers, vector<int>& grumpy, int X) {
int res=0;
int hua=0;// 滑动窗口初始化的和
int hua_max=0; // 滑动窗口遍历过程中的最大值
for(int i=0;i<customers.size();i++){ // 第一段结果集
if(grumpy[i]==0){
res+=customers[i];
}
}
for(int i=0;i<X;i++){ // 初始化第一段滑动窗口
if(grumpy[i]==1){
hua+=customers[i];
}
}
hua_max=hua;
for(int i=X;i<customers.size();i++){ // 滑动窗口更新
if(grumpy[i-X]==1){
hua-=customers[i-X];
}
if(grumpy[i]==1){
hua+=customers[i];
}
hua_max=max(hua,hua_max);
}
res+=hua_max;
return res;
}
};