Loading

力扣 - 1052. 爱生气的书店老板

题目

1052. 爱生气的书店老板

思路1(滑动窗口1)

  • 先求出老板不生气时候的顾客总数
  • 然后遍历一次customer,i < X就是刚开始取前 X 个大小的窗口先计算,然后接下来每次移动一个单位
  • 每次窗口的计算可以基于上一个窗口的结果来计算
  • 窗口右移,左边窗口出去一个元素,右边窗口进入一个元素
  • 对于出窗口的元素,我们要判断在此时老板是否生气grumpy[i-X] == 1,因为只有生气的话,我们出窗口时候才需要减去他,如果不生气的话,就不用减去了
  • 对于进入窗口的元素,我们也要判断是否老板生气grumpy[i] == 1,只有生气我们才需要加上此时的顾客temp += customers[i];
  • 最后的结果就是所有窗口中最大值的那个

代码

class Solution {
    public int maxSatisfied(int[] customers, int[] grumpy, int X) {
        int res = 0;
        int temp = 0;
        for (int i = 0; i < customers.length; i++) {
            if (grumpy[i] == 0) {
                temp += customers[i];
            }
        }
        for (int i = 0; i < customers.length; i++) {
            if (i < X) {
                if (grumpy[i] == 1) {
                    temp += customers[i];
                }
            } else {
                if (grumpy[i-X] == 1) {
                    temp -= customers[i-X];
                }
                if (grumpy[i] == 1) {
                    temp += customers[i];
                }
                
            }
            res = Math.max(res, temp);
        }
        return res;
    }
}

复杂度分析

  • 时间复杂度:\(O(N)\),其中 N 为 customers 数组长度
  • 空间复杂度:\(O(1)\)

思路2(滑动窗口2)

  • 同样也是滑动窗口,但是有点不同
  • 先求出老板不生气时候的顾客总数记在res,同时将其不生气时候顾客数记为0
  • 然后也是用再遍历一次customers,寻找窗口的最大值maxVal,其中窗口的最大值仅仅包括该窗口大小时老板生气的时候人数,因为不生气已经被置为0了,最后的结果就是res加上窗口的最大值maxVal

代码

class Solution {
    public int maxSatisfied(int[] customers, int[] grumpy, int X) {
        int res = 0;
        int len = customers.length;
        int maxVal = 0;
        for (int i = 0; i < len ; i++) {
            if (grumpy[i] == 0){
                res += customers[i];
                customers[i] = 0;
            }
        }
        int temp = maxVal;
        for (int i = 0; i < len; i++) {
            if (i < X){
                temp += customers[i];
            }else {
                temp += (customers[i]-customers[i-X]);
            }
            maxVal = Math.max(temp, maxVal);
        }
        return res + maxVal;

    }
}

复杂度分析

  • 时间复杂度:\(O(N)\),其中 N 为 customers 数组长度
  • 空间复杂度:\(O(1)\)
posted @ 2020-11-30 15:36  linzeliang  阅读(100)  评论(0)    收藏  举报