序文LeetCode を練習していると、スライディング ウィンドウ タイプの問題によく遭遇します。スライディング ウィンドウの問題は非常に古典的かつ技術的であり、一般的に大企業で出題されます。今日は、スライディングウィンドウのルーチンを学びましょう。記事に間違いがあれば、指摘してください。ありがとうございます〜
スライディングウィンドウとは何ですか?スライディングウィンドウという言葉は誰もが知っていると思います。 TCP について話すとき、私たちはしばしばスライディング ウィンドウ プロトコルについて話します。これは TCP プロトコルのアプリケーションであり、ネットワーク データ転送中に輻輳を回避するためのフロー制御に使用されます。 TCP ヘッダーには、16 ビットのウィンドウ サイズを表す win というフィールドがあります。これは、ローカル TCP 受信バッファが収容できるデータのバイト数を相手に伝え、相手側がデータの送信速度を制御できるようにすることで、フロー制御の目的を達成します。 TCP のスライディング ウィンドウは、ある瞬間のウィンドウ サイズが固定されたスライディング ウィンドウであり、ネットワーク トラフィックなどの要因が変化するとウィンドウ サイズも変化します。アルゴリズムのスライディング ウィンドウは、ウィンドウ (キュー/配列) を維持し、それを連続的にスライドさせて、答えを更新するという点で、多少似ています。スライディング ウィンドウとは、ある種の問題を解決する方法のことです。ある種の問題は、配列上の 2 つのポインターを同じ方向に移動することによって解決されます。 スライディングウィンドウアルゴリズムの例アルゴリズムの問題を見てみましょう。整数配列が与えられた場合、長さ k の連続するサブ配列の最大合計を計算します。
この質問を見ると、すぐに力ずくで解決する方法を考えますが、2 つの for で十分です。
ブルートフォース法では 2 つのネストされた for ループが使用され、時間の計算量は O(k*n) と理想的ではありませんが、スライディング ウィンドウ アルゴリズムではネストされたループの問題を解決し、時間の計算量を効果的に削減できます。 スライディングウィンドウは、ウィンドウを維持し、継続的にスライドさせてから、答えを更新するためです。 スライディング ウィンドウ アルゴリズムを使用して、次の手順を実行します。 k=2のとき、
k=3の場合も同様
したがって、次のようなコードを記述できます。
スライディング ウィンドウを使用すると、時間の計算量は O(n) のみになります。 スライディングウィンドウはどのような問題を解決できますか?スライディング ウィンドウを使用して解決できる LeetCode の問題はどれですか? 一般に、最小カバー部分文字列、最小の長さを持つサブ配列などの部分文字列の問題はすべて、スライディング ウィンドウ アルゴリズムを使用して解決できます。より典型的なスライディングウィンドウの質問は次のとおりです。
これらはすべて Leetcode からのオリジナルの質問です。Leetcode の公式 Web サイトにアクセスして、質問の雰囲気をつかんでください。 スライディングウィンドウフレームルーチンスライディング ウィンドウの一般的な論理フレームワーク、疑似コードは次のとおりです。
基本的なプロセスは次のとおりです。
このフレームワークを使用して、実際の LeetCode の質問を解決してみましょう。 タイトル: 文字列 s が与えられた場合、重複する文字を含まない最長の部分文字列の長さを計算してください。 例1:
例2:
重複した文字があるかどうかを判断する必要があるため、ウィンドウとしてハッシュセット(HashSet)を使用します。
Leetcode ケース分析印象を深めるために、実際の LeetCode の質問をもう一つ見てみましょう。 タイトル: 文字列 S と文字列 T が与えられます。 T 内のすべての文字を含む S の最小の部分文字列を返します。 S に T のすべての文字を含む部分文字列がない場合、空の文字列 "" が返されます。 例1:
例2:
私たちは今でもこのフレームワークプロセスを適用しています:
元の文字列の長さを取得します。 これは比較的簡単です。元の質問では、文字列 S をトラバースするために左ポインタと右ポインタがまだ必要だからです。
次にウィンドウ(配列、ハッシュ、キュー)を維持し、右にシフトし、左に減らす まず、長さが 0 の最小ウィンドウを定義します。ウィンドウを定義するときは、ウィンドウがいつ右に移動するのか、いつ左に縮小するのか、そしてどのように比較して答えを更新するのかを考える必要があります。 最小のウィンドウを右にシフトできるのはいつですか? 質問では T のすべての部分文字列をカバーする必要があるため、ウィンドウは T のすべての文字が含まれるまで先頭で右にシフトできます。 明らかに、ウィンドウ文字列 ADOBEC は、T のすべての文字をカバーする S の最初の部分文字列です。ただし、私たちが探しているのは最小の部分文字列であり、ADOBEC が最小のものではない可能性があります。なぜなら:
条件を満たす最初のウィンドウ文字列 ADOBEC を見つけた後、より小さな子ウィンドウ文字列を探します。我々はできる:
ウィンドウは最初に左側に縮小され、次に右側に移動し、条件を満たすウィンドウが保存されます 上記の手順を繰り返し、条件を満たすウィンドウを保存し、比較して最小の部分文字列を取得します。条件を満たす最小の部分文字列はBANCである この問題の難しいところは、実際には S の部分文字列に T が含まれているかどうかをどうやって判断するかということです。コードを見てみましょう。
leetcode 提出の結果は次のとおりです。 |
>>: AI 駆動型データ分析ツールが企業や組織にもたらすメリット
人工知能製品が私たちの生活の中でますます普及するにつれて、テクノロジーの発展は社会の関心の焦点となっ...
ディープフェイクは登場以来、人間性の暗い側面へと向かっています。 Bステーションのユーザーは、陸小玲...
各種の大規模モデルやディープニューラルネットワークの登場により、人工知能の発展に対応し、高い計算能力...
現代の IT ネットワークは、ファイアウォール、ルーター、スイッチ、サーバー、ワークステーション、そ...
2020 年に世界中の企業の 42% がサイバー攻撃を受けたことをご存知ですか? サイバー犯罪者が...
[[273668]] ▲写真:アクアノートロボットがNASAの中立実験室で水中浮遊テストを受けてい...
この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...
2019 年に人工知能の分野はどのように進化するでしょうか? 過去数年と比べてどのように変化するでし...
近年の退職者の急増は、労働力不足が現実であることを示している。セントルイス連邦準備銀行の調査によると...
産業用ロボットは、さまざまな産業用タスクを自動的に実行できる一種の機器として、製造、組み立て、梱包、...
DevOps チームがプロセスの自動化を計画している場合は、ビジネス プロセス管理 (BPM) エン...
既存のビジネスやソリューションをベースに、企業は AI 機能を導入することで、どのようにすれば効率性...
[51CTO.com クイック翻訳] この記事では、ディープラーニングアルゴリズムを使用してデータモ...
はじめに:国内の求人検索サイトのデータによると、2019年現在、上海の自然言語処理(NLP)関連職種...