LeetCodeスライディングウィンドウパターン徹底解説
スライディングウィンドウ入門
「連鎖・部分文字列・配列の問題は、まず双方向ポインタを考えよ。
双方向ポインタ三兄弟、それぞれに魅力あり。
速いポインタと遅いポインタは魔法使い、連結リスト操作に敵なし。
マージソートで中点を探し、連結リストの循環を判定。
左右ポインタが最も一般的、配列の両端から中央へ。
反転配列にはこれを頼れ、二分探索は弟分。
スライ ...
6月8日 18:46 投稿
競技プログラミング問題集:基本アルゴリズムの実践
最短区間カバー問題
指定された種類数を満たす最小連続区間を探索する問題です。スライディングウィンドウ手法を用い、要素の出現頻度を動的に管理しながら最適解を導出します。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<int> cookTypes(n);
for (int i = 0; i < n; ++i ...
5月31日 19:21 投稿
スライディングウィンドウの最大値を求めるアルゴリズム
スライディングウィンドウ問題において、各ウィンドウ内の最大値を効率的に求めるには、双方向キュー(deque)を活用した単調キューというデータ構造が有効である。このアプローチにより、O(n)の時間計算量で解を導出できる。
双方向キューの特性と選択理由
通常のキュー(queue)は、要素の追加が末尾から、取り出しが先頭からのみ可能である。一方、双方向キュー(deq ...
5月29日 23:52 投稿
最小部分文字列の探索:スライディングウィンドウ手法の実装
問題定義
2つの文字列 s と t が与えられた場合、s 内の部分文字列の中で、t のすべての文字(重複を含む)を含む最小の長さを持つものを見つけます。該当する部分文字列が存在しない場合は空文字列を返します。
この問題は、スライディングウィンドウ(Sliding Window)アルゴリズムの典型例です。左右2つのポインタを用いてウィンドウの範囲を動的に管理することで、効率 ...
5月29日 02:43 投稿
Codeforces Round 938 Div.3 問題セット解説とアルゴリズム実装
問題A:ヨーグルト購入の最適化(貪欲法)
課題の概要
1本あたりの価格が single 円、2本セットの価格が pair_cost 円のヨーグルトが販売されている。合計 n 本を購入する際、最小の総支出額を求める。
実装アプローチ
セット購入の単価(pair_cost / 2)と通常価格を比較する。セット単価が通常価格より安価な場合は、可能な限りセットで購入し、余った分を単品で処理する ...
5月14日 06:06 投稿
可変長スライディングウィンドウの実装パターンと典型問題
スライディングウィンドウの適用条件
スライディングウィンドウは、配列や文字列における連続した部分列に関する問題に有効です。特に、以下のような要件を持つ問題に適しています:
部分配列・部分文字列の最小/最大長を求める
特定の条件を満たす最短/最長の連続要素を探索する
許容誤差(例:最大k個の0を1に変換)付きでの最適解を求める
基本的な実装手順
...
5月13日 15:34 投稿