LeetCode 1052 爱生气的书店老板 HERODING的LeetCode之路

今天,书店老板有一家店打算试营业 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)
链接:https://leetcode-cn.com/problems/grumpy-bookstore-owner
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:
这也是一道滑动窗口类型的题目,首先我们要把能够确定的满意度计算出来,即老板不生气时的所有顾客数量,在每次计算后,都要把统计进去的位置赋值为0,以便后序滑动窗口的计算,接着就是滑动窗口,遍历整个数组,窗口大小为X,计算每个X大小内的数值(注意此时只有生气时的顾客数量,不生气时的已经归零了),最后找到最大数值的窗口即找到最大满意度,注解已经很详尽了,代码如下:

class Solution {
    
    
public:
    int maxSatisfied(vector<int>& customers, vector<int>& grumpy, int X) {
    
    
        int count = 0;
        // 统计不生气时间的顾客
        for(int i = 0 ; i < customers.size(); i ++) {
    
    
            // 如果不生气
            if(grumpy[i] == 0) {
    
    
                count += customers[i];
                // 归零
                customers[i] = 0;
            }
        }
        // 定义滑动窗口的左右位置以及当前的满意量
        int left = 0, right = 0, cur = count;
        while(right < customers.size()) {
    
    
            // 更新当前满意量
            cur += customers[right];
            if(right - left + 1 > X) {
    
    
                cur -= customers[left ++];
            }
            // 更新最大满意量
            count = max(count, cur);
            // 窗口右移
            right ++;
        }
        return count;
    }
};


/*作者:heroding
链接:https://leetcode-cn.com/problems/grumpy-bookstore-owner/solution/ji-bai-shuang-95czui-xiang-xi-si-lu-by-h-9k9j/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/

猜你喜欢

转载自blog.csdn.net/HERODING23/article/details/113965045