【每日一題】愛生氣的書店老闆

Aikoin發表於2024-04-26

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. 首先,計算出老闆不使用秘密技巧時,所有顧客滿意的數量。

  2. 接下來,使用一個長度為 minutes 的滑動視窗,計算每個視窗內老闆使用秘密技巧後可以使顧客滿意的數量增加多少。具體步驟如下:

    • 初始化視窗,計算第一個視窗內老闆使用秘密技巧後可以使顧客滿意的數量增加多少。
    • 從第二個視窗開始,每次滑動視窗時,計算新視窗內老闆使用秘密技巧後可以使顧客滿意的數量增加多少。同時,需要減去上一個視窗的第一個分鐘的滿意顧客數量(如果老闆在這個時間段使用秘密技巧的話)。
  3. 返回最大的滿意顧客數量。

class Solution(object):
    def maxSatisfied(self, customers, grumpy, minutes):
        """
        :type customers: List[int]
        :type grumpy: List[int]
        :type minutes: int
        :rtype: int
        """
        n = len(customers)
        total_satisfy = sum(customers[i] for i in range(n) if grumpy[i] == 0)
        current_increase = 0
        
        # 從第一個視窗計算能增加多少滿意人數
        for i in range(minutes):
            if grumpy[i] == 1:
                current_increase += customers[i]
        
        # 長為minutes的滑動視窗
        max_increase = current_increase
        for i in range(minutes, n):
            if grumpy[i] == 1:
                current_increase += customers[i]
            if grumpy[i - minutes] == 1:
                current_increase -= customers[i - minutes]
            max_increase = max(max_increase, current_increase)
        
        return total_satisfy + max_increase

我自己寫的題解是這樣的,沒有上面那個簡潔,也放一下:

class Solution(object):
    def maxSatisfied(self, customers, grumpy, minutes):
        """
        :type customers: List[int]
        :type grumpy: List[int]
        :type minutes: int
        :rtype: int
        """
        happy = [1 - x for x in grumpy] # 不生氣為1,生氣為0
        total_satisfiy = sum(x * y for x, y in zip(customers, happy)) # 總滿意人數
        # 初始化一個長為minutes的滑動視窗
        start = 0
        end = minutes
        # 從第一個視窗計算能增加多少滿意人數
        for i in range(start, end):
            if happy[i] == 0:
                total_satisfiy += customers[i]
        max_satisfiy = total_satisfiy
        # 滑動視窗
        while end < len(customers):
            if happy[start] == 0:
                total_satisfiy -= customers[start]
            if happy[end] == 0:
                total_satisfiy += customers[end]
            if max_satisfiy < total_satisfiy:
                max_satisfiy = total_satisfiy
            start += 1
            end += 1
        
        return max_satisfiy

相關文章