思路:滑动窗口
- 分成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; }};