https://leetcode.com/problems/grumpy-bookstore-owner/description/
给定一个两个长都是 n n n的数组 c c c和 g g g, c c c是代表每天顾客的满意值, g g g代表每天店长是否生气, 0 0 0代表生气, 1 1 1代表不生气。店长不生气的那天,可以取得满意值;否则不能取得满意值。店长可以发动技能,使得连续 x x x天都不生气,但最多只能发动一次。问 n n n天内他能得到的顾客总满意值总和最大是多少。
我们考虑发动一次技能能最多多得多少满意度,这个其实就是求数组 [ c i g i ] [c_ig_i] [cigi]的长 x x x的区间最大和,可以直接扫描一遍得出。原本的满意度总和为数组 [ c i ( 1 − g i ) ] [c_i(1-g_i)] [ci(1−gi)]的总和,原本总和加上新增的即为新的最大总和。代码如下:
class Solution {
public:
int maxSatisfied(vector<int>& customers, vector<int>& grumpy, int minutes) {
int res = 0, n = customers.size();
for (int i = 0, s = 0; i < n; i++) {
s += grumpy[i] * customers[i];
if (i >= minutes) s -= grumpy[i - minutes] * customers[i - minutes];
res = max(res, s);
}
for (int i = 0; i < n; i++) res += !grumpy[i] * customers[i];
return res;
}
};
时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)。