LeetCode-1052。Angry Bookstore Owner [Grumpy Bookstore Owner] [Medium]-分析とコード[Java]
1.トピック
今日、書店のオーナーは、customers.length分を試用して開店する予定の店を持っています。毎分、何人かの顧客(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 <=顧客[i] <= 1000
- 0 <=不機嫌[i] <= 1
出典:LeetCode
リンク:https://leetcode-cn.com/problems/grumpy-bookstore-owner
著作権はLeetCodeが所有しています。商用の再版については、公式の承認に連絡してください。非商用の再版については、出典を示してください。
2、分析とコード
1.スライディングウィンドウ
(1)考える
一方では、書店の所有者が怒っていない場合は、満足している顧客の数を決定します。他方では、長さXのスライディングウィンドウを設計します。統計ウィンドウで、書店によって引き起こされた不満の顧客の最大数。所有者の怒りは2つの合計です。解決策。
(2)コード
class Solution {
public int maxSatisfied(int[] customers, int[] grumpy, int X) {
int n = customers.length, custNum = 0, dec = 0;
for (int i = 0; i < X; i++) {
if (grumpy[i] == 1)
dec += customers[i];
else
custNum += customers[i];//统计顾客满意数
}
int decMax = dec;//减小的最大损失
for (int i = X; i < n; i++) {
if (grumpy[i - X] == 1)//移出窗口的不满意顾客数
dec -= customers[i - X];
if (grumpy[i] == 1)
dec += customers[i];//移入窗口的不满意顾客数
else
custNum += customers[i];//继续统计顾客满意数
decMax = Math.max(decMax, dec);
}
return custNum + decMax;
}
}
(3)結果
実行時間:4ミリ秒、
すべてのJava送信でユーザーの39.80%を上回っています。メモリ消費量:40.7 MB、すべてのJava送信でユーザーの87.15%を上回っています。
3、その他
何もありません。