【Lintcode】1849. Grumpy Bookstore Owner
技術標籤:# 棧、佇列、串及其他資料結構演算法leetcode資料結構
題目地址:
https://www.lintcode.com/problem/grumpy-bookstore-owner/description
給定一個兩個長都是 n n n的陣列 c c c和 g g g, c c c是代表每天顧客的滿意值, g g g代表每天店長是否生氣, 0 0 0代表生氣, 1 1 1代表不生氣。店長不生氣的那天,可以取得滿意值;否則不能取得滿意值。店長可以發動技能,使得連續 X X X天都不生氣,但最多隻能發動一次。問這 n n n天他能得到的滿意值總和最大是多少。
思路是字首和。由於要計算連續
X
X
public class Solution {
/**
* @param customers: the number of customers
* @param grumpy: the owner's temper every day
* @param X: X days
* @return: calc the max satisfied customers
*/
public int maxSatisfied(int[ ] customers, int[] grumpy, int X) {
// write your code here
int n = customers.length;
int[] preSum = new int[n + 1], lSum = new int[n + 1];
for (int i = 0; i < n; i++) {
preSum[i + 1] = preSum[i] + customers[i];
lSum[i + 1] = lSum[i];
if (grumpy[i] == 0) {
lSum[i + 1] += customers[i];
}
}
// 注意這裡要特判一下X長度大於等於n的情況,這個情況後面是列舉不到的
if (X >= n) {
return preSum[n + 1];
}
int res = 0;
// 開始枚舉發動技能的第一天的下標
for (int i = 0; i <= n - X; i++) {
res = Math.max(res, lSum[i] + (preSum[i + X] - preSum[i]) + (lSum[n] - lSum[i + X]));
}
return res;
}
}
時空複雜度 O ( n ) O(n) O(n)。