1052. Grumpy Bookstore Owner

Today, the bookstore owner has a store open for customers.length minutes.  Every minute, some number of customers (customers[i]) enter the store, and all those customers leave after the end of that minute.

On some minutes, the bookstore owner is grumpy.  If the bookstore owner is grumpy on the i-th minute, grumpy[i] = 1, otherwise grumpy[i] = 0.  When the bookstore owner is grumpy, the customers of that minute are not satisfied, otherwise they are satisfied.

The bookstore owner knows a secret technique to keep themselves not grumpy for X minutes straight, but can only use it once.

Return the maximum number of customers that can be satisfied throughout the day.

 

Example 1:

Input: customers = [1,0,1,2,1,1,7,5], grumpy = [0,1,0,1,0,1,0,1], X = 3
Output: 16
Explanation: The bookstore owner keeps themselves not grumpy for the last 3 minutes. 
The maximum number of customers that can be satisfied = 1 + 1 + 1 + 1 + 7 + 5 = 16.

 

Note:

  • 1 <= X <= customers.length == grumpy.length <= 20000
  • 0 <= customers[i] <= 1000
  • 0 <= grumpy[i] <= 1

 

class Solution {
    public int maxSatisfied(int[] customers, int[] grumpy, int X) {
        int n = customers.length;
        int res = 0, left = 0, curmax = 0, max = 0;
        int[] window = new int[n];
        
        for(int right = 0; right < n; right++) {
            if(grumpy[right] == 1) {
                window[right] = customers[right];
                curmax += customers[right];
            }
            else {
                window[right] = 0;
                res += customers[right];
            }
            if(right >= X) {
                curmax -= window[left];
                left++;
            }
            max = Math.max(curmax, max);
        }
        return max + res;
    }
}

sliding window,max是window中最大的grumpy customers,res是非grumpy(不受影响)

class Solution {
    public int maxSatisfied(int[] customers, int[] grumpy, int X) {
        int satis = 0, maxwin = 0, curwin = 0;
        for(int i = 0; i < customers.length; i++) {
            if(grumpy[i] == 0) satis += customers[i];
            else {
                curwin += customers[i];
            }
            if(i >= X) curwin -= grumpy[i - X] * customers[i - X];
            maxwin = Math.max(curwin, maxwin);
        }
        return satis + maxwin;
    }
}

就不用array了,拉跨

因为window大小固定了,所以当i 》= X时,left就是 i - X, right就是i。所以grumpy == 0就加到satis,==1就加到当前的window。如果超了window就尝试更新window里最大的值

posted @ 2020-08-12 23:56  Schwifty  阅读(117)  评论(0编辑  收藏  举报