力扣 - 1052. 爱生气的书店老板
题目
思路1(滑动窗口1)
- 先求出老板不生气时候的顾客总数
- 然后遍历一次customer,
i < X就是刚开始取前 X 个大小的窗口先计算,然后接下来每次移动一个单位 - 每次窗口的计算可以基于上一个窗口的结果来计算
- 窗口右移,左边窗口出去一个元素,右边窗口进入一个元素
- 对于出窗口的元素,我们要判断在此时老板是否生气
grumpy[i-X] == 1,因为只有生气的话,我们出窗口时候才需要减去他,如果不生气的话,就不用减去了 - 对于进入窗口的元素,我们也要判断是否老板生气
grumpy[i] == 1,只有生气我们才需要加上此时的顾客temp += customers[i]; - 最后的结果就是所有窗口中最大值的那个
代码
class Solution {
public int maxSatisfied(int[] customers, int[] grumpy, int X) {
int res = 0;
int temp = 0;
for (int i = 0; i < customers.length; i++) {
if (grumpy[i] == 0) {
temp += customers[i];
}
}
for (int i = 0; i < customers.length; i++) {
if (i < X) {
if (grumpy[i] == 1) {
temp += customers[i];
}
} else {
if (grumpy[i-X] == 1) {
temp -= customers[i-X];
}
if (grumpy[i] == 1) {
temp += customers[i];
}
}
res = Math.max(res, temp);
}
return res;
}
}
复杂度分析
- 时间复杂度:\(O(N)\),其中 N 为 customers 数组长度
- 空间复杂度:\(O(1)\)
思路2(滑动窗口2)
- 同样也是滑动窗口,但是有点不同
- 先求出老板不生气时候的顾客总数记在res,同时将其不生气时候顾客数记为0
- 然后也是用再遍历一次customers,寻找窗口的最大值maxVal,其中窗口的最大值仅仅包括该窗口大小时老板生气的时候人数,因为不生气已经被置为0了,最后的结果就是res加上窗口的最大值maxVal
代码
class Solution {
public int maxSatisfied(int[] customers, int[] grumpy, int X) {
int res = 0;
int len = customers.length;
int maxVal = 0;
for (int i = 0; i < len ; i++) {
if (grumpy[i] == 0){
res += customers[i];
customers[i] = 0;
}
}
int temp = maxVal;
for (int i = 0; i < len; i++) {
if (i < X){
temp += customers[i];
}else {
temp += (customers[i]-customers[i-X]);
}
maxVal = Math.max(temp, maxVal);
}
return res + maxVal;
}
}
复杂度分析
- 时间复杂度:\(O(N)\),其中 N 为 customers 数组长度
- 空间复杂度:\(O(1)\)
我走得很慢,但我从不后退!

浙公网安备 33010602011771号