題目
文字
今天,書店老闆有一家店打算試營業 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
來源:力扣(LeetCode)
模板
int maxSatisfied(int* customers, int customersSize, int* grumpy, int grumpySize, int X){
}
解題
分析
本題可以使用滑動視窗
總體思路如下
首先統計老闆不控制自己情緒的情況下會滿意的客戶的總人數
for (int i = 0; i < customersSize; i++) if (grumpy[i] == 0) total += customers[i];
再加入老闆控制情緒,長度為X,自前向後滑動這個X視窗
for (int i = 0; i < X; i++) add += customers[i] * grumpy[i];
已知生氣時狀態為1,我們控制情緒之後就會將這部分的人留下,所以可以理解為
customer[i]*grupy[i]
而本身據不生氣的時候狀態為0的情況已經在第一步統計進去了
往後滑動的過程中,我們需要減去前面的,增加後面的for (int i = X; i < customersSize; i++) add = add - customers[i - X] * grumpy[i - X] + customers[i] * grumpy[i];
原始碼
int maxSatisfied(int* customers, int customersSize, int* grumpy, int grumpySize, int X) {
int total = 0;
int n = customersSize;
for (int i = 0; i < customersSize; i++)
if (grumpy[i] == 0)
total += customers[i];
int add = 0;
for (int i = 0; i < X; i++)
add += customers[i] * grumpy[i];
int maxAdd = add;
for (int i = X; i < customersSize; i++) {
add = add - customers[i - X] * grumpy[i - X] + customers[i] * grumpy[i];
maxAdd = fmax(maxAdd, add);
}
return total + maxAdd;
}