[LeetCode] 1004.連続する最大数III連続する1の最大数III(中)(JAVA)
件名アドレス:https://leetcode.com/problems/max-consecutive-ones-iii/
タイトル説明:
0と1の配列Aが与えられた場合、最大K個の値を0から1に変更できます。
1のみを含む最長の(連続した)サブ配列の長さを返します。
例1:
入力:A = [1,1,1,0,0,0,1,1,1,1,0]、K = 2
出力:6
説明:
[1,1,1,0,0、1、1 、1,1,1、1 ]
太字の番号は、最長のサブアレイを下線で0から1に反転しました。
例2:
入力:A = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1]、K = 3
出力:10
説明:
[0,0、1,1、1、1、1,1,1、1、1,1、0,0,0,1,1,1,1]
太字の番号が0から1に反転しました。最長のサブアレイには下線が引かれています。
注意:
- 1 <= A.length <= 20000
- 0 <= K <= A.length
- A [i]は0または1です
一般的なアイデア
複数の0と1で構成される配列Aが与えられた場合、最大K個の値を0から1に変更できます。
1のみを含む最長の(連続した)サブ配列の長さを返します。
問題解決方法
- 接頭辞とP(i)を使用して、[0、i]の最初のi要素の合計を示します。
- P(右)-P(左)は[左、右]の間隔の合計を表し、(右-左+ 1)-(P(右)-P(左))は間隔の0の数を表します
- 区間内の0の数がK以下である限り、この区間は連続サブ配列です。
- だから、スライディングウィンドウのアイデアを採用し、左右を見つけ続けてから、ウィンドウの長さを計算します
class Solution {
public int longestOnes(int[] A, int K) {
int left = 0;
int right = 0;
int lSum = 0;
int rSum = 0;
int res = 0;
for (right = 0; right < A.length; right++) {
rSum += 1 - A[right];
while (rSum - lSum > K) {
lSum += 1 - A[left];
left++;
}
res = Math.max(res, right - left + 1);
}
return res;
}
}
実行時間:4ミリ秒、Javaユーザーの47.01%を打ち負かす
メモリ消費量:40 MB、Javaユーザーの11.37%を打ち負かす