1052. 爱生气的书店老板

本文介绍了一种使用滑动窗口算法解决LeetCode上的题目——爱生气的书店老板。通过分析示例,展示了如何计算在书店老板使用情绪抑制技巧后,最多能使多少客户满意。解题思路包括计算不使用技能时的满意客户数,以及利用滑动窗口更新最大满意客户数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1052. 爱生气的书店老板

#滑动窗口
有一个书店老板,他的书店开了 n 分钟。每分钟都有一些顾客进入这家商店。给定一个长度为 n 的整数数组 customers ,其中 customers[i] 是在第 i 分钟开始时进入商店的顾客数量,所有这些顾客在第 i 分钟结束后离开。

在某些时候,书店老板会生气。 如果书店老板在第 i 分钟生气,那么 grumpy[i] = 1,否则 grumpy[i] = 0。

当书店老板生气时,那一分钟的顾客就会不满意,若老板不生气则顾客是满意的。

书店老板知道一个秘密技巧,能抑制自己的情绪,可以让自己连续 minutes 分钟不生气,但却只能使用一次。

请你返回 这一天营业下来,最多有多少客户能够感到满意 。

示例 1:

输入:customers = [1,0,1,2,1,1,7,5], grumpy = [0,1,0,1,0,1,0,1], minutes = 3
输出:16
解释:书店老板在最后 3 分钟保持冷静。
感到满意的最大客户数量 = 1 + 1 + 1 + 1 + 7 + 5 = 16.
示例 2:

输入:customers = [1], grumpy = [0], minutes = 1
输出:1

提示:

n == customers.length == grumpy.length
1 <= minutes <= n <= 2 * 104
0 <= customers[i] <= 1000
grumpy[i] == 0 or 1

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/grumpy-bookstore-owner

解法:滑动窗口

class Solution {
    public int maxSatisfied(int[] customers, int[] grumpy, int minutes) {
        // 老板不用技能时,感到满足的顾客的数量
        int n = 0;
        int length = customers.length;

        for (int i = 0; i < length; i++) {
            int p = customers[i];
            // 老板不生气
            if (grumpy[i] == 0) {
                n += p;
            }
            // 老板一开始就发动技能,比如 minutes 是 3,那么 0 1 2 分钟的顾客都会满足(因为老板用了技能,不会生气)
            if (i < minutes && grumpy[i] == 1) {
                n += p;
            }
        }
        // max 为最多能满足的顾客的数量,初始值为老板在一开始就发动技能
        int max = n;
        // 滑动窗口,从第一次发动技能之后开始到最后
        for (int i = minutes; i < length; i++) {
            // 每次长度为 minutes 的滑动窗口每次向右移动时,最左侧从窗口中滑出的那一分钟,如果老板是生气的,就要把满意的顾客数量减去那一分钟的顾客数量。

            // 从窗口滑入
            if (grumpy[i] == 1) {
                n += customers[i];
            }
            // 从窗口滑出
            if (grumpy[i - minutes] == 1) {
                n -= customers[i - minutes];
            }
            max = n > max ? n : max;
        }
        return max;
    }
}

作者:xiu-qiang-jiang
链接:https://leetcode.cn/problems/grumpy-bookstore-owner/solution/by-xiu-qiang-jiang-foid/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值