[LeetCode] 1052.不機嫌そうな書店のオーナー(中)(JAVA)
タイトルアドレス:https://leetcode.com/problems/grumpy-bookstore-owner/
タイトル説明:
今日、書店のオーナーは、customers.length分に店を開いています。毎分、何人かの顧客(customers [i])が店に入り、それらの顧客はすべてその分の終わりの後に去ります。
数分で、本屋の所有者は不機嫌です。書店のオーナーがi番目の分に不機嫌である場合、grumpy [i] = 1、それ以外の場合はgrumpy [i] = 0です。書店のオーナーが不機嫌である場合、その分の顧客は満足しません。
書店のオーナーは、X分間不機嫌にならないようにするための秘密のテクニックを知っていますが、それは1回しか使用できません。
1日を通して満足できる最大数の顧客を返します。
例1:
Input: customers = [1,0,1,2,1,1,7,5], grumpy = [0,1,0,1,0,1,0,1], X = 3
Output: 16
Explanation: The bookstore owner keeps themselves not grumpy for the last 3 minutes.
The maximum number of customers that can be satisfied = 1 + 1 + 1 + 1 + 7 + 5 = 16.
注意:
- 1 <= X <= Customers.length == grumpy.length <= 20000
- 0 <=顧客[i] <= 1000
- 0 <=不機嫌[i] <= 1
一般的なアイデア
今日、書店のオーナーは、customers.length分を試用して開店する予定の店を持っています。毎分、何人かの顧客(customers [i])が書店に入り、その分が終わると、これらすべての顧客は去ります。
ある時点で、書店のオーナーは怒ります。書店のオーナーがi分目に怒っている場合は、grumpy [i] = 1、それ以外の場合はgrumpy [i] = 0です。書店のオーナーが怒っていると、その瞬間のお客さんは不満になり、怒っていなければ満足します。
書店のオーナーは、感情を抑えてX分間怒らないようにする秘訣を知っていますが、使用できるのは1回だけです。
満足できる最大のお客様である今日の営業に戻ってください。
問題解決方法
- 書店のオーナーが怒っていないときの結果を合計してみましょう
- 次に、上司がX分間怒らないようにすることができる最も多くの顧客の範囲を見つけます
- 実際、区間[i、i + X-1]で不機嫌[i] == 1の場合、顧客[j](i <= j <i + X)の最大合計は何であるかを調べることです。
class Solution {
public int maxSatisfied(int[] customers, int[] grumpy, int X) {
int res = 0;
int max = 0;
int cur = 0;
for (int i = 0; i < customers.length; i++) {
if (grumpy[i] == 1) {
cur += customers[i];
} else {
res += customers[i];
}
if (i >= X && grumpy[i - X] == 1) cur -= customers[i - X];
if (cur > max) max = cur;
}
return res + max;
}
}
実行時間:3ミリ秒、Javaユーザーの79.44%を上回っています
メモリ消費量:41.1 MB、Javaユーザーの14.99%を上回っています