今天,書店老板有一家店打算試營業 customers.length 分鐘。每分鐘都有一些顧客(customers[i])會進入書店,所有這些顧客都會在那一分鐘結束后離開。
在某些時候,書店老板會生氣。 如果書店老板在第 i 分鐘生氣,那么 grumpy[i] = 1,否則 grumpy[i] = 0。 當書店老板生氣時,那一分鐘的顧客就會不滿意,不生氣則他們是滿意的。
書店老板知道一個秘密技巧,能抑制自己的情緒,可以讓自己連續 X 分鐘不生氣,但卻只能使用一次。
請你返回這一天營業下來,最多有多少客戶能夠感到滿意的數量。
示例:
輸入:customers = [1,0,1,2,1,1,7,5], grumpy = [0,1,0,1,0,1,0,1], X = 3
輸出:16
解釋:
書店老板在最后 3 分鐘保持冷靜。
感到滿意的最大客戶數量 = 1 + 1 + 1 + 1 + 7 + 5 = 16.
提示:
1 <= X <= customers.length == grumpy.length <= 20000
0 <= customers[i] <= 1000
0 <= grumpy[i] <= 1
解題思路
維護一個大小為X的滑動窗口,找出一個窗口期,使得增加的滿意客戶最多(就是找出原本最多客戶不滿意的那個窗口)
代碼
class Solution {public int maxSatisfied(int[] customers, int[] grumpy, int X) {int l=0,r=0,n=customers.length,sum=0,res=0,c=0,rl=0,rr=0;while (r<n)//只計算不滿意客戶的滑動窗口{if(grumpy[r]==1)sum+=customers[r];if(r-l+1>X){if(grumpy[l]==1)sum-=customers[l];l++;}if(sum>=res){res=sum;rl=l;rr=r;//記錄窗口位置和不滿意客戶的數量}r++;}for (int i = 0; i < n; i++) {if (grumpy[i]==0)c+=customers[i];else if(i>=rl&&i<=rr) c+=customers[i];//處于結果窗口的客戶,全部都變滿意}return res+c;}
}