爱生气的书店老板

LeetCode每日一题,1052. Grumpy Bookstore Owner

先看题目描述

ybha7V.png

大意就是给定数组 customers,grumpy 和整数 X,customers 代表每分钟来的顾客数量,grumpy 记录老板什么时候生气,当 grumpy[i] 为 1 时代表老板在第 i 分钟生气,生气时顾客就不会满意,老板有一个特殊的技巧,可以令自己在连续的 X 分钟内保持冷静,但这个技巧只可以用一次,问可以满意的顾客数量最多为多少

算法和思路

滑动窗口

首先考虑老板不使用保持冷静的技巧时,由于 grumpy 数组和 customers 数组都已给定,那么可以得到满意的顾客数量是固定的,设为 A。然后使用保持冷静的技巧,就是可以使一些之前不能满意的顾客变得满意,设额外增加的变满意的顾客数量为 B,于是我们就可以构建一个长度为 X 的滑动窗口,移动滑动窗口来遍历数组,期间统计最大的 B 值,最后返回 A + B 即可

算法源码

滑动窗口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Solution {
public int maxSatisfied(int[] customers, int[] grumpy, int X) {
int ans = 0;
int len = customers.length;
for (int i = 0; i < len; i++) {
if (grumpy[i] == 0) {
ans += customers[i];
}
}

int left = 0;
int right = X;
int cur = 0;
for (int i = 0; i < X; i++) {
if (grumpy[i] == 1) {
cur += customers[i];
}
}

int max = cur;
while (right < len) {
if (grumpy[right] == 1) {
cur += customers[right];
}
right++;
if (grumpy[left] == 1) {
cur -= customers[left];
}
left++;
max = Math.max(max, cur);
}
ans += max;
return ans;
}
}