1. [1,2,3,4,5] k=2 -> 9 (4+5)
  2. [1,2,3,4,5] k=3 -> 12 (3+4+5)
  3. [5,1,1,1,5] k=2 -> 6 (5+1)
  4. [2,3,4,1,5] k=1 -> 5 (=max)
  5. [1,3,2,6,-1,4,1,8,2] k=5 -> 18
  6. [-1,-2,-3,-4] k=2 -> -3 (-1+-2)
  7. [7] k=1 -> 7
コース一覧
コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB
スライド窓の最大和

コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB

ソート、探索、再帰などのアルゴリズムに加え、OS (プロセス、メモリ、ファイルシステム)、ネットワーク (TCP/IP、HTTP、DNS、CDN)、データベースまで、Web エンジニアに必要な CS の基礎を一本で学べる総合コースです。エンジニア転職を目指す学習者や、CS 出身でない現役エンジニアを対象としています。約 34 時間 (1 日 30 分 × 68 日) で 135 レッスンを修了でき、修了後は技術選定やシステム設計の議論に自信を持って参加できるようになります。

1
再帰の基礎
01. 階乗(再帰)5分
02. フィボナッチ数(再帰)5分
03. 累乗(再帰)5分
04. 配列の合計(再帰)5分
05. 桁数を数える(再帰)5分
06. 文字列を逆順(再帰)5分
07. ユークリッドの互除法(GCD)5分
08. 第1章まとめクイズ — 再帰の基礎5分
2
第2章 探索
01. 線形探索で位置を返す5分
02. 二分探索 (反復版)5分
03. 二分探索 (再帰版)5分
04. lower_bound (最初に >= target の位置)5分
05. ピーク要素検索5分
06. 回転ソート配列での探索5分
07. 第2章まとめクイズ5分
3
ソート
01. バブルソート実装5分
02. 選択ソート5分
03. 挿入ソート5分
04. マージソート5分
05. クイックソート5分
06. カウントソート5分
07. 比較関数つきソート5分
08. 第3章まとめクイズ5分
4
配列 / 文字列の応用
01. 双方向ポインタで和 = K5分
02. スライド窓の最大和5分
03. 回文判定5分
04. 重複なし最長部分文字列5分
05. 大きな数の文字列乗算5分
06. アナグラムグルーピング5分
07. 第4章まとめクイズ — 配列 / 文字列の応用5分
5
クラスと OOP
01. 長方形クラス(面積と周長)5分
02. スタッククラス(push と pop)5分
03. キュークラス(enqueue と dequeue)5分
04. 単方向リンクリスト5分
05. 二分探索木 (BST) への挿入5分
06. カウンタクラス(機能合成)5分
07. 第 5 章クイズ — クラスと OOP5分
6
動的計画法 (基礎)
01. メモ化フィボナッチ5分
02. DP配列でフィボナッチ5分
03. 階段の登り方5分
04. コイン両替最小枚数5分
05. 0/1 ナップサック問題5分
06. 最長共通部分列 (LCS)5分
07. 第6章まとめクイズ5分
7
総合演習
01. ソート済み 2 配列のマージ5分
02. 配列の k 回転5分
03. カッコの妥当性5分
04. ローマ数字を整数に5分
05. 整数をローマ数字に5分
06. 雨水を溜める5分
07. 最終総まとめクイズ5分
8
[OS] Section 1. OS とは
01. コンピューターとOSの役割15分
02. OSの歴史(バッチ→マルチタスク→マルチユーザー)15分
03. カーネルとユーザーランド15分
04. システムコールの仕組み15分
05. Linux / macOS / Windows のアーキ比較15分
9
[OS] Section 2. プロセスとスレッド
01. プロセスとは15分
02. スレッドとプロセスの違い15分
03. コンテキストスイッチ15分
04. スケジューラとアルゴリズム15分
05. プロセス間通信(IPC)15分
10
[OS] Section 3. メモリ管理
01. メモリ階層(レジスタ→キャッシュ→RAM→ディスク)15分
02. 仮想メモリ15分
03. ページングとスワップ15分
04. mmap とメモリマップトファイル15分
05. ガベージコレクション概要15分
11
[OS] Section 4. ファイルシステム
01. ファイルシステムとは15分
02. i-node とディレクトリ15分
03. ext4 / APFS / NTFS の違い15分
04. ジャーナリングと耐障害性15分
05. パーミッションと所有者15分
12
[OS] Section 5. 同期と並行性
01. レースコンディション15分
02. Mutex と Semaphore15分
03. デッドロック15分
04. 非同期と並行15分
05. イベントループと epoll15分
13
[ネットワーク] ネットワークの全体像
01. ネットワークとは8分
02. OSI 7階層モデル10分
03. TCP/IP 4階層モデル9分
04. パケットとフレーム9分
05. ルーター・スイッチ・ハブ9分
14
[ネットワーク] IP とルーティング
01. IPアドレス (IPv4 / IPv6)10分
02. サブネットマスクと CIDR11分
03. NAT とプライベートIP9分
04. ルーティングと経路選択10分
05. ファイアウォール基礎9分
15
[ネットワーク] TCP / UDP
01. TCP と UDP の違い9分
02. 3-way ハンドシェイク9分
03. 輻輳制御と再送10分
04. UDP の用途 (DNS / 動画 / ゲーム)8分
05. ポート番号と well-known port9分
16
[ネットワーク] HTTP / HTTPS
01. HTTP の基本10分
02. HTTP メソッド9分
03. HTTPS と TLS ハンドシェイク10分
04. HTTP/2 と HTTP/3 (QUIC)10分
05. REST API の設計原則10分
17
[ネットワーク] DNS とドメイン
01. DNS とは8分
02. レコードタイプ10分
03. 名前解決の流れ10分
04. DNS キャッシュと TTL9分
05. CDN の仕組みと Anycast10分
18
[ネットワーク] 応用
01. ロードバランサ (L4 / L7)10分
02. プロキシとリバースプロキシ9分
03. WebSocket とリアルタイム通信9分
04. gRPC と HTTP/2 利用10分
19
[データベース] データベースの基礎
01. データベースとは8分
02. RDB と NoSQL の違い8分
03. データベースの歴史8分
04. エンティティ関係モデル (ER)8分
05. 主キー・外部キー・候補キー8分
20
[データベース] 正規化
01. 正規化とは何か8分
02. 第1正規形8分
03. 第2正規形8分
04. 第3正規形8分
05. 非正規化のトレードオフ8分
21
[データベース] インデックスと B-tree
01. インデックスの役割8分
02. B-tree の仕組み8分
03. B+tree(実際の DB 実装)8分
04. ハッシュインデックス8分
05. カバリングインデックス8分
22
[データベース] トランザクションと ACID
01. トランザクションとは8分
02. ACID 特性8分
03. 分離レベル8分
04. MVCC(マルチバージョン同時実行制御)8分
05. デッドロックと回避8分
23
[データベース] クエリ最適化
01. クエリプランナの役割8分
02. EXPLAIN の読み方8分
03. Nested Loop / Hash / Merge Join8分
04. インデックスチューニング8分
05. 統計情報とカーディナリティ8分
24
[データベース] スケーリング
01. レプリケーション8分
02. シャーディング8分
03. CAP 定理8分
04. 結果整合性8分
05. NewSQL と分散 SQL8分

スライド窓の最大和

尺取り法の窓

窓をずらすたびに、全部を足し直している

連続した k 個の合計のうち、最大のものを知りたい。素直に書くと、窓の位置ごとに k 個を足し直します。5 日ぶんの売上で 3 日の窓なら、3 回の足し算を 3 か所で、合計 9 回です。窓を 30 日に広げれば、1 か所につき 30 回になります。

ここで、隣り合う 2 つの窓を並べてみてください。[4, 8, 2] の次は [8, 2, 9] です。8 と 2 は両方に入っています。足し直しているぶんのほとんどは、前回すでに足した数でした。

変わるのは両端の 2 つだけ

窓を 1 つ右へずらすと、抜けるのは左端の 1 つ、入るのは新しい右端の 1 つ。それ以外は変わりません。だから前回の合計から抜ける値を引き、入る値を足せば、それが次の合計です。

Python

sales = [4, 8, 2, 9, 3] total = sales[0] + sales[1] + sales[2] # 14 total = total - sales[0] + sales[3] # 4 が抜けて 9 が入る -> 19 print(total)

最初の窓だけは k 個を足す必要がありますが、そこから先は 1 か所につき引き算と足し算が 1 回ずつです。手間が窓の大きさに左右されなくなり、要素数だけで決まります。

[4, 8, 2, 9, 3] を最後まで動かすと、14 の次が 19、その次は 8 が抜けて 3 が入るので 14 です。最大は 19 でした。足し算の回数は、最初の 3 回と、その後の 2 か所ぶんで合計 7 回。素朴に足し直すと 9 回でした。

この差は入力が大きくなるほど開きます。100 万件のデータを 1,000 件の窓で見るなら、素朴なやり方は 10 億回、差分だけの更新なら 100 万回です。窓を広げても手間が変わらないというのが、この方法のいちばんの取り柄です。

抜ける値がどこにいるかを、上の例で確かめておきます。入れたのは 4 番目の sales[3]、抜けたのは 1 番目の sales[0]。差は 3 で、これは窓の大きさそのものです。窓が 3 つぶんの幅を持っているのだから、右端から 3 つ戻ったところがちょうど窓の外側の 1 つ手前になります。

ここを 1 つずらすと、まだ窓の中にいる値を引くか、すでに外へ出た値をもう一度引くことになります。合計が少しずつ狂うだけで例外は出ないので、小さな配列で手計算と突き合わせて確かめてください。

最大値の置き場所を 0 で始めない

最大値を覚える変数を 0 から始めると、すべて負の値の配列で 0 が返ります。どの窓の合計も 0 より小さいので、一度も更新されないからです。売上ではなく損益や気温を入れた瞬間に化けます。

置き場所の初期値は、最初の窓の合計にしてください。最初の窓は必ず存在するので、比較の土台としてこれ以上ふさわしい値はありません。

要件

  1. 1 <= k <= len(arr) であると仮定して良い
  2. 計算量は O(n) であること (素朴な O(n*k) は不可)
  3. 戻り値は窓内の最大の和 (整数) であること

入出力例

maxWindowSum([1,2,3,4,5], 2) → 9 maxWindowSum([1,2,3,4,5], 3) → 12 maxWindowSum([5,1,1,1,5], 2) → 6 maxWindowSum([2,3,4,1,5], 1) → 5 maxWindowSum([1,3,2,6,-1,4,1,8,2], 5) → 18 maxWindowSum([-1,-2,-3,-4], 2) → -3 maxWindowSum([7], 1) → 7

ヒント

まず arr[:k] の和を windowSum に入れる

i = k から len(arr) - 1 まで進めながら、windowSum += arr[i] - arr[i - k] で差分更新する

毎ステップで windowSum と best を比較して best を更新する

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • 回文判定

    文字列が前から読んでも後ろから読んでも同じ「回文」であるかを、双方向ポインタで `O(n)` 判定する。

  • 重複なし最長部分文字列

    文字列内で重複文字を含まない連続した部分文字列の最大長を、可変長スライディングウィンドウで `O(n)` で求める。

  • 大きな数の文字列乗算

    整数型では桁あふれする大きな数を「文字列のまま筆算」で乗算する。桁ごとに掛け算してキャリーを上げる古典問題。

  • アナグラムグルーピング

    文字列の配列を、同じ文字の並び替えになっているもの同士でグループ化する。ソートをキーにした hashmap 分類の典型問題。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 素数1 と自分自身でしか割り切れない自然数
  • 配列サイズ固定の同型データの集まり
  • 変数データに名前をつけて参照する仕組み
  • 計算量入力サイズに対する処理時間の伸び方
  • 戻り値呼び出し元への返答を表す点線矢印
main.py
学習モード
エディタを読み込んでいます

メモ

スライド窓の最大和

⌘S で保存