题目

image.png

思路

  • 求grumpy在全0时与正常grump在区间X范围内customers在这个区间和的最大差值。为了方便计算某区间的求和使用前缀和的技巧。p1计算正常grumpy内的customers的前缀和,p2计算grumpy全部为0的前缀和,然后在长度超过X时就可以计算它们的差值,最后取最大差值再加上P1的总和即可

    代码

    1. public int maxSatisfied(int[] customers, int[] grumpy, int X) {
    2. int[] p1 = new int[customers.length + 1];
    3. int[] p2 = new int[customers.length + 1];
    4. int max = 0;
    5. for (int i = 1; i < p1.length; i++) {
    6. p1[i] = p1[i - 1] + (grumpy[i - 1] == 1 ? 0 : customers[i - 1]);
    7. p2[i] = p2[i - 1] + customers[i - 1];
    8. if (i >= X) max = Math.max(max, p2[i] - p2[i - X] - p1[i] + p1[i - X]);
    9. }
    10. return max + p1[p1.length - 1];
    11. }
    爱生气的书店老板