トピック:
1052怒っている書店のオーナー
今日、書店のオーナーは、顧客の試用を開始する予定のショップを持っています。毎分、何人かの顧客(customers [i])が書店に入り、その分が終わると、これらすべての顧客は去ります。
ある時点で、書店のオーナーは腹を立てるでしょう。書店のオーナーがi分目に怒っている場合は、grumpy [i] = 1、それ以外の場合はgrumpy [i] = 0です。書店のオーナーが怒っていると、その瞬間のお客さんは不満になり、怒っていなければ満足します。
書店のオーナーは、感情を抑えてX分間怒らないようにする秘訣を知っていますが、使用できるのは1回だけです。
満足できる最大のお客様である今日の営業に戻ってください。
例:
入力:customers = [1,0,1,2,1,1,7,5]、grumpy = [0,1,0,1,0,1,0,1]、X = 3
出力:16
説明:
書店のオーナーは最後の3分間落ち着いていた。
満足している顧客の最大数= 1 + 1 + 1 + 1 + 7 + 5 = 16。
促す:
1 <= X <= Customers.length == grumpy.length <= 20000
0 <= Customers [i] <= 1000
0 <= grumpy [i] <= 1
問題解決のアイデア:
これらの顧客は、怒っていない時間にすでに満足しているので、直接的な統計は良好です。この時点で、問題は、怒りの瞬間に顧客の数が最も多い、長さがXXのウィンドウを選択することです。
次のステップは、ウィンドウを左から右に移動し、怒りの分が発生したときにウィンドウに対応する人数を加算し、ウィンドウから出てくる怒りの議事録から対応する人数を減算して、中間の最大値。
ちょっとしたコツがあります:grumpy [i]の0と1の値をフラグとして使用し、それをcustomers [i]で乗算して、顧客満足度の値を取得します。
複雑さの分析:
時間計算量:O(n)、ここでnはアレイの顧客の長さと不機嫌です。2つの配列を2回トラバースする必要があります。スペースの複雑さ:O(1)。
問題解決のPythonコード:
class Solution:
def maxSatisfied(self, customers: List[int], grumpy: List[int], X: int) -> int:
total = sum(c for c,g in zip(customers,grumpy) if g==0)
# 可以巧妙利用grumpy的0、1值作为flag
Max_adder = adder = sum(c*g for c,g in zip(customers[:X],grumpy[:X]))
# 滑窗法,adder加上新格子减去旧格子即可
for i in range(X, len(customers)):
adder += customers[i]*grumpy[i]-customers[i-X]*grumpy[i-X]
Max_adder = max(Max_adder, adder)
return Max_adder+total
著者:a-qing-ge
リンク:https://leetcode-cn.com/problems/grumpy-bookstore-owner/solution/pu-tong-hua-chuang-ti-qiao-miao-li-yong-1opld/
ソース:LeetCode https://leetcode-cn.com/problems/grumpy-bookstore-owner/