leetcode 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

分析思路

  1. 根据题目,customers 表示不同时间内(如每分钟)店内招待的客户数,对应的 grumpy 则表示不同时间点老板是否生气(即客户是否满意),长度与 customers 一致;
  2. 使用技巧后可以连续 minutes 分钟不生气,相当于在某个 minutes 时间长度内,原本不满意的客户会变成满意的客户;
  3. 因为基础的满意客户数是固定的(不使用技巧时),所以求的最大满意客户数,即是求某个 minutes 连续时段内包含最多的不满意客户数,加上基础满意客户数,符合固定窗口大小的滑动窗口算法特性;
  4. 先计算第一个窗口,根据老板生气与否为条件,分别计算满意客户数和不满意客户数,并将第一个窗口的不满意客户数,作为窗口最大不满意客户数的初始值;
  5. 继续滑动窗口遍历剩余位置,持续更新基础满意客户数,同时维护当前窗口的不满意客户数,并同步判断更新最大窗口不满意客户数;
  6. 滑动窗口过程中:
    • 右边界扩展:根据老板生气与否,判断加入客户是属于满意客户还是不满意客户;
    • 左边界收缩:如果移出位置时间点老板是生气的,则当前窗口剔除该时间点的不满意客户数,反之不变;
  7. 滑动结束后,返回 基础满意客户总数 + 最大窗口不满意客户数 之和。

go 实现示例

func maxSatisfied(customers []int, grumpy []int, minutes int) int {

	// 获取customers长度
	n := len(customers)

	// 定义所有满意客户数并初始化
	satisfiedAll := 0

	// 定义窗口不满意客户数并初始化
	unsatisfiedWindow := 0

	// 先计算第一个窗口
	for i := 0; i < minutes; i++ {

		if grumpy[i] == 0 {
			satisfiedAll += customers[i]
		} else {
			unsatisfiedWindow += customers[i]
		}
	}

	// 定义窗口最大不满意客户数,初始值为第一个窗口不满意客户数
	maxUnsatisfiedWindow := unsatisfiedWindow

	// 开始滑动窗口寻找最佳位置
	for i := minutes; i < n; i++ {

		// 更新右边界
		if grumpy[i] == 0 {
			satisfiedAll += customers[i]
		} else {
			unsatisfiedWindow += customers[i]
		}

		// 更新左边界
		if grumpy[i-minutes] == 1 {
			unsatisfiedWindow -= customers[i-minutes]
		}

		// 如果当前窗口不满意客户数大于窗口最大不满意客户数,则更新窗口最大不满意客户数
		if unsatisfiedWindow > maxUnsatisfiedWindow {
			maxUnsatisfiedWindow = unsatisfiedWindow
		}

	}

	// 最多客户满意数,等于 总满意客户数 + 最大窗口不满意客户数
	return satisfiedAll + maxUnsatisfiedWindow

}
posted @ 2025-08-19 16:45  505donkey  阅读(26)  评论(0)    收藏  举报