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;
}
};