LC每日一题|20240423 - 1052. 爱生气的书店老板

89 阅读2分钟

LC每日一题|20240423 - 1052. 爱生气的书店老板

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

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

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

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

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

提示:

  • n == customers.length == grumpy.length
  • 1 <= minutes <= n <= 2 * 10^4
  • 0 <= customers[i] <= 1000
  • grumpy[i] == 0 or 1

题目等级:Medium

解题思路

非常简单的一道滑窗问题。

我们可以先计算出老板本来就不生气的时间段内有多少顾客是满意的。然后,滑窗统计在每个 minutes 时长内本应该不满意(grumpy[i] == 1)但由于老板抑制情绪而满意的顾客数量最大值,返回二者之和。

AC代码

class Solution {
    fun maxSatisfied(customers: IntArray, grumpy: IntArray, minutes: Int): Int {
        var o = 0
        for (i in customers.indices) { o += if (grumpy[i] == 0) customers[i] else 0 }
        var x = 0
        repeat(minutes) { x += if (grumpy[it] == 1) customers[it] else 0 }
        var max = x
        for (i in minutes until customers.size) {
            x += if (grumpy[i] == 1) customers[i] else 0
            x -= if (grumpy[i - minutes] == 1) customers[i - minutes] else 0
            max = Math.max(max, x)
        }
        return o + max
    }
}

时间复杂度:O(N),需要常数次遍历。

空间复杂度:O(1),需要常数个变量。