[LeetCode] 1004.連続する最大数III連続する1の最大数III(中)(JAVA)

[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、11、1,1,1、1、1,1、0,0,0,1,1,1,1]
太字の番号が0から1に反転しました。最長のサブアレイには下線が引かれています。

注意:

  1. 1 <= A.length <= 20000
  2. 0 <= K <= A.length
  3. A [i]は0または1です

一般的なアイデア

複数の0と1で構成される配列Aが与えられた場合、最大K個の値を0から1に変更できます。

1のみを含む最長の(連続した)サブ配列の長さを返します。

問題解決方法

  1. 接頭辞とP(i)を使用して、[0、i]の最初のi要素の合計を示します。
  2. P(右)-P(左)は[左、右]の間隔の合計を表し、(右-左+ 1)-(P(右)-P(左))は間隔の0の数を表します
  3. 区間内の0の数がK以下である限り、この区間は連続サブ配列です。
  4. だから、スライディングウィンドウのアイデアを採用し、左右を見つけ続けてから、ウィンドウの長さを計算します
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%を打ち負かす

私の公式アカウントに注意を払うことを歓迎します、LeetCodeは毎日1つの質問を更新します

おすすめ

転載: blog.csdn.net/qq_16927853/article/details/113857439