思路:滑动窗口
- 分成2部分,第一,记录原有的客户总量
all_customers
;第二,找到最大的增加量increase_customers
,然后计算二者总和即可。 - 问题关键在于,如何寻找最大的增量:可以使用滑动窗口的思想
- 滑动窗口还是分成两部分,第一,找到第一个窗口并计算。第二,将这个窗口向后滑动,每一次扔掉一个左边的数据,加上一个右边的数据,不断更新,直到找到
max_increase_customers
代码:
class Solution {
public:
int maxSatisfied(vector<int>& customers, vector<int>& grumpy, int minutes) {
int all_customers = 0, num_customers = customers.size();
// 记录原有的客户数量
for (int i = 0; i < num_customers; ++i) {
all_customers += ((!grumpy[i]) * customers[i]);
}
// 统计增加量
int increase_customers = 0;
for (int i = 0; i <= minutes - 1; ++i) {
increase_customers += grumpy[i] * customers[i];
}
// 滑动窗口
int max_increase_customers = increase_customers;
for (int left = 1, right = minutes; right < num_customers; ++right, ++left) {
increase_customers -= (grumpy[left - 1] * customers[left - 1]);
increase_customers += (grumpy[right] * customers[right]);
max_increase_customers = max(max_increase_customers, increase_customers);
}
return all_customers + max_increase_customers;
}
};