1. 这题其实最关键的是转换思路. 不生气时间段的人数和都是固定的, 所以题目的意思是让求连续X时间段内生气的人数和的最大值.
2. 可以运用滑动窗口.看窗口大小为X的窗口内,不生气的人数和的最大值是多少.
class Solution {
public:
int maxSatisfied(vector<int>& customers, vector<int>& grumpy, int X) {
int left=0,right=0;
int ans1=0, ans2=0;
int tmp=0;
while(right<customers.size()) {
//不生气的人数全部都要加上.
if(grumpy[right]==0) ans1 += customers[right];
//生气的人数由tmp计算.
else tmp += customers[right];
//当窗口大小不满足条件时,需要缩小窗口.
if(right-left+1>X) {
//只有当left值为1时,才需要将原先加上的值去掉.
if(grumpy[left]==1) tmp -= customers[left];
left++;
}
right++;
//找到每一个窗口的最大值,防止出现[3]这样一个值的情况,
//不经过while循环.
ans2 = max(tmp, ans2);
}
//最大值为不生气人数加上生气人数最大值.
return ans1+ans2;
}
};