1004.連続する1の最大数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,最长的子数组长度为 6。
例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,最长的子数组长度为 10。
促す:
- 1 <= A.length <= 20000
- 0 <= K <= A.length
- A [i]は0または1です
方法1:スライディングウィンドウ
問題解決のアイデア
- ダブルポインタはまだ
[left, right)
スライディングウィンドウシミュレーション right
遭遇したとき、右へのポインタを横切る時間を、演算結果の値と移動次へのポインタを右。K
0
ret = max(ret, right - left)
left
0
参照コード
public int longestOnes(int[] A, int K) {
int n = A.length;
int ret = 0;
int left = 0, right = 0, count = 0;
while (right < n) {
if (A[right] == 0) {
if (count < K) {
count++;
} else {
ret = Math.max(ret, right - left);
do {
left++;
} while (A[left - 1] == 1);
}
}
right++;
}
return Math.max(ret, right - left);
}
の結果
- 時間計算量:O(n)
- スペースの複雑さ:O(1)