目次
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;
}
};
最後に次のように書きます。
以上がこの記事の内容です、読んでいただきありがとうございます。
何かを得たと感じたら、ブロガーに「いいね! 」を与えることができます。
記事の内容に漏れや間違いがある場合は、ブロガーにプライベートメッセージを送信するか、コメント欄で指摘してください〜