leetcode
leetcode 1001 ~ 1050
爱生气的书店老板

爱生气的书店老板

难度:

标签:

题目描述

代码结果

运行时间: 39 ms, 内存: 17.6 MB


解释

方法:

该题解采用了滑动窗口的方法来解决问题。首先,通过一个滑动窗口来找出如果书店老板连续不生气持续 `minutes` 分钟时,可以使得最多的顾客满意的区间。在这个过程中,我们维护一个窗口,窗口大小为 `minutes`,窗口内包括了因为老板生气而导致的不满意的顾客数量。接着,我们遍历整个 `customers` 数组,调整 `grumpy` 数组,使得在选定的 `minutes` 分钟内,老板不生气(即将 `grumpy` 对应位置置为0)。最后,重新计算整个数组中满意顾客的总数。通过这种方式,我们可以得到最大的满意顾客数。

时间复杂度:

O(n)

空间复杂度:

O(1)

代码细节讲解

🦆
在滑动窗口算法中,为什么选择对只在老板生气的分钟内的顾客数进行累加和窗口移动?
在这个问题中,关键在于最大化在书店老板不生气的时间段内顾客的满意度。由于老板生气时顾客不满意,这些分钟造成的不满意顾客数量是可以通过使用老板不生气的技巧来避免的。因此,通过累加只在老板生气时的顾客数,我们可以找到如果老板连续不生气一段时间(minutes分钟),可以转变最多的不满意顾客为满意顾客的时间段。这是一个优化问题,通过滑动窗口来寻找这样的最优时间段,使得转变效果最大。
🦆
如果最优的连续 `minutes` 分钟开始或结束在数组的边界,这种情况下算法的表现是否稳定?
算法在这种情况下表现是稳定的。滑动窗口算法设计之初就考虑到了边界情况,窗口可以从数组的开始处滑动到结束处。当窗口开始或结束在数组的边界时,算法依然正确地处理了窗口内的顾客数累加和窗口外的顾客数减去,保证了在任何情况下都能找到最优的连续 `minutes` 分钟使得最多的顾客满意。
🦆
算法中如何保证只修改一次 `grumpy` 数组,确保书店老板只使用一次不生气的技巧?
算法首先通过滑动窗口找到了使得最多顾客满意的最优连续 `minutes` 分钟(最大不满意顾客数的窗口)。一旦这个窗口确定后,我们在这个窗口范围内将 `grumpy` 数组对应的值从1改为0,表示在这个时段老板不生气。这个修改是在整个算法过程中唯一一次对 `grumpy` 数组的修改,确保了老板的不生气技巧只被使用一次。
🦆
为什么在完成滑动窗口操作后,需要单独遍历一次 `customers` 数组来计算总的满意顾客数?
虽然滑动窗口帮助我们确定了最优的 `minutes` 分钟使得最多顾客由不满变为满意,但窗口操作只是帮助我们确定了这个时间段,并没有计算这一操作后整个数组中的总满意顾客数。因此,需要在修改了 `grumpy` 数组后,重新遍历 `customers` 数组,根据现在的 `grumpy` 状态统计总的满意顾客数。这是因为数组中的其他部分也可能有顾客在老板不生气时已经满意,这部分顾客在滑动窗口操作中没有被计算。

相关问题