[アルゴリズムトピックのブレークスルー] スライディングウィンドウ - 最小長の部分配列 (9)

目次

1. 質問分析

2. アルゴリズム原理

3. コードの書き方

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


1. 質問分析

質問リンク: 209. 最小長の部分配列 - Leetcode

 質問では正の整数が与えられることに注意してください。

質問の要件を理解するのは難しくありません。最短の部分配列を見つけることです。

2. アルゴリズム原理

ブルート フォースが使用される場合、それは非常に複雑な O(N3) アルゴリズムになります。

スライディング ウィンドウは鮮やかな名前ですが、実際にはダブル ポインタ アルゴリズムです。

2 つのダブル ポインターが戻らずに同じ方向に移動することを、ウィンドウのようにスライドするため、スライディング ウィンドウと呼びます。

では、この問題を解決するには、スライディング ウィンドウをどのように使用すればよいでしょうか?

1. 2 つのポインターをウィンドウの左右の境界として使用します。

2. 窓に入る

3. ウィンドウを終了する方法を決定する

この質問に関しては次のようになります。

左右の 2 つのポインターは最初に 0 に初期化され、

合計が目標値より小さい場合は、右++、

合計が目標値以上の場合は、結果を記録し、左++にします。 

3. コードの書き方

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int n = nums.size(), sum = 0, len = INT_MAX;
        int left = 0, right = 0;
        while(right < n) {
            sum += nums[right];
            while(sum >= target) {
                len = min(len, right - left + 1);
                sum -= nums[left++];
            }
            right++;
        }
        return len == INT_MAX ? 0 : len;
    }
};

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

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

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

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

おすすめ

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