思考私立学校-スライディングウィンドウ

スライディングウィンドウアルゴリズムの本質は、ウィンドウ内の値がタイトルの要件を満たすようにウィンドウを維持することです。これは主に、配列/文字列のサブ要素の問題を解決するために使用されます。ネストされたループの問題は、単一ループの問題に変換されるため、時間の複雑さが軽減されます。

次に、スライディングウィンドウを使用して、特定のトピックを通じて問題とその考えを解決する方法について説明します。

トピック

LeetCode3。繰り返し文字のない最長の部分文字列

画像

アイデア

暴力的な解の時間計算量は比較的高く、O(n ^ 2)達するため、時間計算量を減らすためにスライディングウィンドウ法が採用されています。

  • マップデータ構造ストレージ(k、v)を定義します。ここで、キー値は文字であり、値の値は文字位置+ 1です。1を追加すると、次の文字位置まで文字位置が繰り返されないことを意味し、マップトラバーサルプロセス中に常に更新されます。最後に出現した位置でその値を+1にします。

  • 繰り返されない部分文字列の開始位置を開始として定義し、終了位置を終了として定義します

  • エンドが後方にトラバースし続けると、マップ内のキャラクターと同じ状況が発生します。このとき、同じキャラクターの位置がスライディングウィンドウ内にある場合と、スライディングウィンドウ内にある場合の2つの状況があります。同じキャラクターの位置がスライディングウィンドウにありません。

    • 同じ文字がスライディングウィンドウにある場合、つまりstart <map.get(同じ文字)の場合、開始を更新する必要があります
    • 同じ文字がスライディングウィンドウにない場合、つまりstart> map.get(同じ文字)の場合、統計を更新する必要はありません
  • つまり、start = max(start、map.get(同じ文字))

  • この時点で、開始と終了の間に重複する要素がないことを確認できます

コード

  public int lengthOfLongestSubstring(String s) {
            int n = s.length(), ans = 0;
            Map<Character, Integer> map = new HashMap<>();
            for (int end = 0, start = 0; end < n; end++) {
                char alpha = s.charAt(end);
                if (map.containsKey(alpha)) {
                    start = Math.max(map.get(alpha), start);
                }
                ans = Math.max(ans, end - start + 1);
                map.put(s.charAt(end), end + 1);
            }
            return ans;
        }

総括する

スライディングウィンドウの問題の鍵は、左右のスライディングの限界を理解することにあり、ウィンドウが縮小するときが重要なポイントです。

やっと

  • 読んでやりがいを感じたら、いいねをあげたいと思います。これが更新の最大のモチベーションになります。ご支援ありがとうございます。
  • Javaとコンピュータの基本的な知識に焦点を当てた私の公開アカウント[JavaFox]に注目してください。私を信じていない場合は、私を叩いてください。
  • 読んだ後に異なる意見や提案がある場合は、コメントして私たちと共有してください。皆様のご支援、ご愛顧を賜りますようお願い申し上げます。

-私は竹湖です。あなたと同じくらいプログラミングが大好きです。

画像

おすすめ

転載: blog.csdn.net/issunmingzhi/article/details/111286112