「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 2 つのポインターとスライディング ウィンドウのパターン

2 つのポインターとスライディング ウィンドウのパターン

2024 年 9 月 11 日に公開
ブラウズ:340

Two Pointer and sliding window pattern

ツーポインタとスライディング ウィンドウのパターン

パターン 1: 定数ウィンドウ (ウィンドウ = 4 または何らかの整数値など)

たとえば、(-ve および ve) の整数の配列が与えられた場合、サイズ k.

の連続ウィンドウの最大合計を見つけます。

パターン 2:(可変ウィンドウ サイズ) を持つ最大の部分配列/部分文字列 例: sum

  • アプローチ:
    • ブルートフォース: 考えられるすべての部分配列を生成し、最大長の部分配列を選択します 合計
  • 最良/最適: 2 つのポインターとスライディング ウィンドウを利用して、時間の複雑さを O(n) に削減します。

パターン 3: が sum=k のような部分配列/部分文字列の番号。
これは、いつ拡大するか (右)、いつ縮小するか (左) が難しくなるため、解決するのが非常に困難です。

この問題は パターン 2
を使用して解決できます sum =k.

となる部分文字列の数を見つけるなどの問題を解決する場合
  • これは次のように分解できます

    • sum
    • sum になります。

パターン 4: 最短/最小ウィンドウを見つける

パターン 2 のさまざまなアプローチ:
例: sum

public class Sample{
    public static void main(String args[]){
        n = 10;
        int arr[] = new int[n];

        //Brute force approach for finding the longest subarray with sum  k) break; /// optimization if the sum is greater than the k, what is the point in going forward? 
            }
        }

2 つのポインターとスライディング ウィンドウを使用したより良いアプローチ

        //O(n n) in the worst case r will move from 0 to n and in the worst case left will move from 0 0 n as well so 2n
        int left = 0;
        int right =0;
        int sum = 0;
        int maxLen = 0;
        while(right k){
                sum = sum-arr[left];
                left  ;
            }
            if(sum 



最適なアプローチ:
部分配列が見つかったらその長さを maxLen に保存することはわかっていますが、 arr[right] を追加するときに合計が k を超えた場合、現在は sum = sum-arr[left] を実行して left を実行することで左に縮小しています。
現在の Max 長さが maxLen であることがわかっています。左側のインデックスを縮小し続けると、条件 ( maxLen である別の部分配列を見つけると、maxLen のみが更新されます。

最適なアプローチは、サブ配列が条件 (

        int right =0;
        int sum = 0;
        int maxLen = 0;
        while(right k){// this will ensure that the left is incremented one by one (not till the sum




          

            
  

            
        
リリースステートメント この記事は次の場所に転載されています: https://dev.to/prashantrmishra/two-pointer-and-sliding-window-pattern-4118?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3