[アルゴリズムトピックブレークスルー] ダブルポインター - 連続する 1 の最大数 III (11)

目次

1. 質問分析

2. アルゴリズム原理

3. コードの書き方

最後に次のように書きます。


1. 質問分析

質問リンク: 1004. 連続する 1 の最大数 III - Leetcode

この質問は理解するのが難しいことではありません。実際、1 の最長の連続部分配列を見つけることです。

ただし、k 個の 0 を 1 に反転する操作はサポートされています。

この条件が出ると、この質問の難易度はさらに上がり、状況はさらに複雑になってきました。 

2. アルゴリズム原理

次に、ルールを抽象化する方法を考えます。

この問題を次のように変換します。k 個以下の 0 を含む最長の部分配列を見つけます。

暴力的な列挙を使用する場合、アイデアは比較的単純です。

強引な列挙に基づいて、スライディング ウィンドウを使用してこの問題を最適化できます。

実は、最も難しいステップは、変換問題はすでに終わっているので、このアイデアに基づいてスライディング ウィンドウを設計するだけです。

窓口を整備しておりますので、

0の数が2つ未満の場合、ウィンドウは継続的に拡張されます。

0 の数が 2 に等しい場合、最長の部分配列を記録します。

0 の数が 2 より大きい場合、0 の数が 2 以下になるまでウィンドウを縮小します。

コードを見てみましょう:

3. コードの書き方

class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        unordered_map<int, int> win;
        int len = 0, left = 0, right = 0;
        while(right < nums.size()) {
            len = max(len, right - left);
            win[nums[right++]]++;
            while(left < nums.size() && win[0] > k) {
                win[nums[left++]]--;
            }
        }
        len = max(len, right - left);
        return len;
    }
};

最後に次のように書きます。

以上がこの記事の内容です、読んでいただきありがとうございます。

何かを得たと感じたら、ブロガーに「いいね! 」を与えることができます。

記事の内容に漏れや間違いがある場合は、ブロガーにプライベートメッセージを送信するか、コメント欄で指摘してください〜

おすすめ

転載: blog.csdn.net/Locky136/article/details/131707287