From 6f1ed433a8534f3e67b1aa7d88c4d15538ef9c7f Mon Sep 17 00:00:00 2001 From: myoshizumi Date: Wed, 13 May 2026 19:32:39 +0900 Subject: [PATCH 1/5] =?UTF-8?q?security:=20upgrade=20urllib3=202.6.3=20?= =?UTF-8?q?=E2=86=92=202.7.0=20(CVE:=20decompression=20DoS=20via=20streami?= =?UTF-8?q?ng=20API)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/index.html | 4 +-- requirements.lock.txt | 82 ++++++++++++++++++++----------------------- 2 files changed, 40 insertions(+), 46 deletions(-) diff --git a/public/index.html b/public/index.html index 51546df..91b3cf9 100644 --- a/public/index.html +++ b/public/index.html @@ -512,8 +512,8 @@

  • 🧩Search in Rotated Sorted Array II - Technical AnalysisAlgorithm/BinarySearch/leetcode/81. Search in Rotated Sorted Array II/Claude/README.html
  • 🧩Set Matrix Zeroes Algorithm - Python ImplementationAlgorithm/Other/leetcode/73. Set Matrix Zeroes/Claude/README.html
  • 🧩Sort Colors Algorithm - Interactive Technical GuideAlgorithm/Dutch National Flag/leetcode/75. Sort Colors/Claude/README.html
  • -
  • 🧩Spiral Matrix Algorithm AnalysisAlgorithm/Other/leetcode/54. Spiral Matrix/Claude/README.html
  • 🧩Spiral Matrix Algorithm AnalysisAlgorithm/Other/leetcode/59. Spiral Matrix II/Claude/README.html
  • +
  • 🧩Spiral Matrix Algorithm AnalysisAlgorithm/Other/leetcode/54. Spiral Matrix/Claude/README.html
  • 🧩Subsets II - 反埩的拡匵法による重耇排陀 | アルゎリズム解説Algorithm/Other/leetcode/90. Subsets II/Claude/README.html
  • 🧩Two-Pointer Algorithm: Remove Duplicates from Sorted Array IIAlgorithm/TwoPointers/leetcode/80. Remove Duplicates from Sorted Array II/Claude/README.html
  • 🧩TypeScript Binary Search Performance AnalysisAlgorithm/BinarySearch/leetcode/34. Find First and Last Position of Element in Sorted Array/READEME-typescript.html
  • @@ -697,8 +697,8 @@

  • 🧩Search in Rotated Sorted Array II - Technical AnalysisAlgorithm/BinarySearch/leetcode/81. Search in Rotated Sorted Array II/Claude/README.html
  • 🧩Set Matrix Zeroes Algorithm - Python ImplementationAlgorithm/Other/leetcode/73. Set Matrix Zeroes/Claude/README.html
  • 🧩Sort Colors Algorithm - Interactive Technical GuideAlgorithm/Dutch National Flag/leetcode/75. Sort Colors/Claude/README.html
  • -
  • 🧩Spiral Matrix Algorithm AnalysisAlgorithm/Other/leetcode/54. Spiral Matrix/Claude/README.html
  • 🧩Spiral Matrix Algorithm AnalysisAlgorithm/Other/leetcode/59. Spiral Matrix II/Claude/README.html
  • +
  • 🧩Spiral Matrix Algorithm AnalysisAlgorithm/Other/leetcode/54. Spiral Matrix/Claude/README.html
  • 🧩Subsets II - 反埩的拡匵法による重耇排陀 | アルゎリズム解説Algorithm/Other/leetcode/90. Subsets II/Claude/README.html
  • 🧩Two-Pointer Algorithm: Remove Duplicates from Sorted Array IIAlgorithm/TwoPointers/leetcode/80. Remove Duplicates from Sorted Array II/Claude/README.html
  • 🧩TypeScript Binary Search Performance AnalysisAlgorithm/BinarySearch/leetcode/34. Find First and Last Position of Element in Sorted Array/READEME-typescript.html
  • diff --git a/requirements.lock.txt b/requirements.lock.txt index 8519db4..ea393cb 100644 --- a/requirements.lock.txt +++ b/requirements.lock.txt @@ -4,23 +4,20 @@ argon2-cffi==25.1.0 argon2-cffi-bindings==25.1.0 arrow==1.4.0 asttokens==3.0.0 -async-lru==2.0.5 +async-lru==2.1.0 attrs==25.4.0 -babel==2.17.0 +babel==2.18.0 beautifulsoup4==4.14.2 bleach==6.2.0 -certifi==2025.10.5 +certifi==2026.1.4 cffi==2.0.0 charset-normalizer==3.4.4 comm==0.2.3 -contourpy==1.3.3 -cycler==0.12.1 debugpy==1.8.17 decorator==5.2.1 defusedxml==0.7.1 executing==2.2.1 fastjsonschema==2.21.2 -fonttools==4.61.0 fqdn==1.5.1 h11==0.16.0 httpcore==1.0.9 @@ -28,65 +25,62 @@ httpx==0.28.1 idna==3.11 ipykernel==7.0.1 ipython==9.6.0 -ipython_pygments_lexers==1.1.1 -ipywidgets==8.1.7 +ipython-pygments-lexers==1.1.1 +ipywidgets==8.1.8 isoduration==20.11.0 jedi==0.19.2 -Jinja2==3.1.6 -json5==0.12.1 +jinja2==3.1.6 +json5==0.13.0 jsonpointer==3.0.0 jsonschema==4.25.1 jsonschema-specifications==2025.9.1 +jupyter==1.1.1 +jupyter-client==8.6.3 +jupyter-console==6.6.3 +jupyter-core==5.9.1 jupyter-events==0.12.0 jupyter-lsp==2.3.0 -jupyter_client==8.6.3 -jupyter_core==5.9.1 -jupyter_server==2.18.0 -jupyter_server_terminals==0.5.3 -jupyterlab==4.5.7 -jupyterlab_pygments==0.3.0 -jupyterlab_server==2.27.3 -jupyterlab_widgets==3.0.15 -kiwisolver==1.4.9 +jupyter-server==2.18.0 +jupyter-server-terminals==0.5.3 +jupyterlab==4.5.4 +jupyterlab-myst==2.4.2 +jupyterlab-pygments==0.3.0 +jupyterlab-server==2.28.0 +jupyterlab-widgets==3.0.16 lark==1.3.0 -MarkupSafe==3.0.3 -matplotlib==3.10.7 -matplotlib-inline==0.1.7 +markupsafe==3.0.3 +matplotlib-inline==0.2.1 mistune==3.2.1 nbclient==0.10.2 -nbconvert==7.17.1 +nbconvert==7.16.6 nbformat==5.10.4 nest-asyncio==1.6.0 -notebook_shim==0.2.4 -numpy==2.3.4 +notebook==7.5.3 +notebook-shim==0.2.4 packaging==25.0 -pandas==2.3.3 pandocfilters==1.5.1 parso==0.8.5 pexpect==4.9.0 -pillow==12.2.0 +pip==26.0.1 platformdirs==4.5.0 -prometheus_client==0.23.1 -prompt_toolkit==3.0.52 -psutil==7.1.1 +prometheus-client==0.23.1 +prompt-toolkit==3.0.52 +psutil==7.1.2 ptyprocess==0.7.0 -pure_eval==0.2.3 +pure-eval==0.2.3 pycparser==2.23 -Pygments==2.19.2 -pyparsing==3.2.5 +pygments==2.19.2 python-dateutil==2.9.0.post0 python-json-logger==4.0.0 -pytz==2025.2 -PyYAML==6.0.3 +pyyaml==6.0.3 pyzmq==27.1.0 referencing==0.37.0 -requests==2.33.0 +requests==2.32.5 rfc3339-validator==0.1.4 rfc3986-validator==0.1.1 rfc3987-syntax==1.1.0 -rpds-py==0.27.1 -ruff==0.14.1 -Send2Trash==1.8.3 +rpds-py==0.28.0 +send2trash==1.8.3 setuptools==80.9.0 six==1.17.0 sniffio==1.3.1 @@ -94,15 +88,15 @@ soupsieve==2.8 stack-data==0.6.3 terminado==0.18.1 tinycss2==1.4.0 -tornado==6.5.5 +tornado==6.5.2 traitlets==5.14.3 -typing_extensions==4.15.0 +typing-extensions==4.15.0 tzdata==2025.2 uri-template==1.3.0 -urllib3==2.6.3 -uv==0.11.6 +urllib3==2.7.0 wcwidth==0.2.14 webcolors==24.11.1 webencodings==0.5.1 websocket-client==1.9.0 -widgetsnbextension==4.0.14 +wheel==0.45.1 +widgetsnbextension==4.0.15 From 54e083fab4c7ecd7eaf869155dbb75ac0a851941 Mon Sep 17 00:00:00 2001 From: myoshi2891 <96483039+myoshi2891@users.noreply.github.com> Date: Wed, 13 May 2026 10:33:04 +0000 Subject: [PATCH 2/5] build: auto-generate public directory --- public/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/index.html b/public/index.html index 91b3cf9..51546df 100644 --- a/public/index.html +++ b/public/index.html @@ -512,8 +512,8 @@

  • 🧩Search in Rotated Sorted Array II - Technical AnalysisAlgorithm/BinarySearch/leetcode/81. Search in Rotated Sorted Array II/Claude/README.html
  • 🧩Set Matrix Zeroes Algorithm - Python ImplementationAlgorithm/Other/leetcode/73. Set Matrix Zeroes/Claude/README.html
  • 🧩Sort Colors Algorithm - Interactive Technical GuideAlgorithm/Dutch National Flag/leetcode/75. Sort Colors/Claude/README.html
  • -
  • 🧩Spiral Matrix Algorithm AnalysisAlgorithm/Other/leetcode/59. Spiral Matrix II/Claude/README.html
  • 🧩Spiral Matrix Algorithm AnalysisAlgorithm/Other/leetcode/54. Spiral Matrix/Claude/README.html
  • +
  • 🧩Spiral Matrix Algorithm AnalysisAlgorithm/Other/leetcode/59. Spiral Matrix II/Claude/README.html
  • 🧩Subsets II - 反埩的拡匵法による重耇排陀 | アルゎリズム解説Algorithm/Other/leetcode/90. Subsets II/Claude/README.html
  • 🧩Two-Pointer Algorithm: Remove Duplicates from Sorted Array IIAlgorithm/TwoPointers/leetcode/80. Remove Duplicates from Sorted Array II/Claude/README.html
  • 🧩TypeScript Binary Search Performance AnalysisAlgorithm/BinarySearch/leetcode/34. Find First and Last Position of Element in Sorted Array/READEME-typescript.html
  • @@ -697,8 +697,8 @@

  • 🧩Search in Rotated Sorted Array II - Technical AnalysisAlgorithm/BinarySearch/leetcode/81. Search in Rotated Sorted Array II/Claude/README.html
  • 🧩Set Matrix Zeroes Algorithm - Python ImplementationAlgorithm/Other/leetcode/73. Set Matrix Zeroes/Claude/README.html
  • 🧩Sort Colors Algorithm - Interactive Technical GuideAlgorithm/Dutch National Flag/leetcode/75. Sort Colors/Claude/README.html
  • -
  • 🧩Spiral Matrix Algorithm AnalysisAlgorithm/Other/leetcode/59. Spiral Matrix II/Claude/README.html
  • 🧩Spiral Matrix Algorithm AnalysisAlgorithm/Other/leetcode/54. Spiral Matrix/Claude/README.html
  • +
  • 🧩Spiral Matrix Algorithm AnalysisAlgorithm/Other/leetcode/59. Spiral Matrix II/Claude/README.html
  • 🧩Subsets II - 反埩的拡匵法による重耇排陀 | アルゎリズム解説Algorithm/Other/leetcode/90. Subsets II/Claude/README.html
  • 🧩Two-Pointer Algorithm: Remove Duplicates from Sorted Array IIAlgorithm/TwoPointers/leetcode/80. Remove Duplicates from Sorted Array II/Claude/README.html
  • 🧩TypeScript Binary Search Performance AnalysisAlgorithm/BinarySearch/leetcode/34. Find First and Last Position of Element in Sorted Array/READEME-typescript.html
  • From 662f711fd0773afc8d61335a6ad99244a6e2d33f Mon Sep 17 00:00:00 2001 From: myoshizumi Date: Thu, 14 May 2026 18:07:50 +0900 Subject: [PATCH 3/5] feat: migrate Claude artifacts to Sonnet 4.6 Adaptive and update GPT README for Two Sum --- .../claude sonnet 4.6 adaptive/README.md | 587 +++++++ .../README_react.html | 1170 ++++++++++++++ .../Two_Sum_Python.md | 291 ++++ DataStructures/Map/leetcode/claude/README.md | 271 ---- .../Map/leetcode/claude/README_react.html | 1429 ----------------- DataStructures/Map/leetcode/gpt/README.md | 127 +- .../README_react.html | 1170 ++++++++++++++ public/index.html | 10 +- 8 files changed, 3286 insertions(+), 1769 deletions(-) create mode 100644 DataStructures/Map/leetcode/claude sonnet 4.6 adaptive/README.md create mode 100644 DataStructures/Map/leetcode/claude sonnet 4.6 adaptive/README_react.html create mode 100644 DataStructures/Map/leetcode/claude sonnet 4.6 adaptive/Two_Sum_Python.md delete mode 100644 DataStructures/Map/leetcode/claude/README.md delete mode 100644 DataStructures/Map/leetcode/claude/README_react.html create mode 100644 public/DataStructures/Map/leetcode/claude sonnet 4.6 adaptive/README_react.html diff --git a/DataStructures/Map/leetcode/claude sonnet 4.6 adaptive/README.md b/DataStructures/Map/leetcode/claude sonnet 4.6 adaptive/README.md new file mode 100644 index 0000000..d90ef40 --- /dev/null +++ b/DataStructures/Map/leetcode/claude sonnet 4.6 adaptive/README.md @@ -0,0 +1,587 @@ +# Two Sum — ハッシュマップで O(n) を実珟する + +> **LeetCode #1 · Python (CPython 3.11+) 完党解説** + +--- + +## 目次 + +- [抂芁](#overview) +- [アルゎリズム芁点 TL;DR](#tldr) +- [図解](#figures) +- [正しさのスケッチ](#correctness) +- [蚈算量](#complexity) +- [Python 実装](#impl) +- [CPython 最適化ポむント](#cpython) +- [゚ッゞケヌスず怜蚌芳点](#edgecases) +- [FAQ](#faq) + +--- + +

    1. 抂芁

    + +> 💡 **この問題は䞀蚀で蚀うず**、「敎数のリストの䞭から **足すず `target` になる 2 ぀の数のむンデックス䜍眮番号を探す問題**」です。 + +### 問題が難しい理由・ポむント + +䞀番シンプルな解法は「党おの組み合わせを総圓たりで詊す」二重ルヌプです。しかしこれは時間蚈算量凊理にかかる手間の目安が **O(n²)**入力が 2 倍になるず凊理が 4 倍になるこずになり、入力が最倧 10,000 件のずき最悪 **1 億回** の比范が発生したす。 + +本解説では、**ハッシュマップキヌから倀を䞀瞬で取り出せる蟞曞型デヌタ構造** を䜿っお **O(n)**1 床だけ党芁玠を走査するに削枛する手法を説明したす。「今芋おいる数の補数`target` から今の数を匕いた倀を **前に芋たか**」を蟞曞で O(1) に確認するこずがこの問題の栞心です。 + +### 芁件たずめ + +| 項目 | 内容 | +| ---------- | ------------------------------------------------------------------ | +| 入力 | 敎数リスト `nums`長さ 2 以䞊 10,000 以䞋ず敎数 `target` | +| 出力 | 足すず `target` になる 2 芁玠の **むンデックスのリスト** | +| 制玄 | 答えは **必ず 1 ぀だけ** 存圚する。同䞀芁玠を 2 床䜿っおはいけない | +| 目暙蚈算量 | Time: O(n)、Space: O(n) | + +> 📖 **この章で登堎した甚語** +> +> - **むンデックス**リストの䜕番目にあるかを衚す番号。先頭が 0 から始たる +> - **補数complement**`target - num` のこず。今の数ずペアになる数倀 +> - **O(n²)**入力が 2 倍になるず凊理が玄 4 倍になるこず。二重ルヌプに倚い +> - **ハッシュマップ**キヌを特殊な数倀に倉換し、倀の栌玍堎所を䞀瞬O(1)で特定できるデヌタ構造。Pythonの `dict` がこれにあたる + +--- + +

    2. アルゎリズム芁点 TL;DR

    + +> 💡 **TL;DR**Too Long; Didn't Readずは「長くお読めない人向けの芁玄」ずいう意味です。 +> ここではアルゎリズム党䜓の戊略をたずめたす。詳现は埌の章で説明するので、「なんずなくこういう手順で解くんだな」ずいうむメヌゞを぀かむ章ずしお䜍眮づけおください。 + +- **戊略**リストを先頭から 1 床だけ走査端から端たで順に芋るこずし、各芁玠の補数が **すでに蟞曞に蚘録されおいるか** を確認する +- **デヌタ構造**`dict`蟞曞を䜿う。なぜなら `in` 挔算子による怜玢が O(1) で完了するため。リストの `in` 挔算は O(n) なので遅い +- **時間蚈算量**O(n) — リストを 1 床だけ走査する +- **空間蚈算量**O(n) — 最悪で n 個の数倀を蟞曞に蚘録する +- **メモリ**蟞曞に `{数倀: むンデックス}` の圢でメモを残しながら進める。「前に芋た数倀の蚘録垳」ずしお機胜する + +### アルゎリズムの手順抂芁 + +``` +1. seen = {} ずいう空の蟞曞メモ垳を甚意する +2. リストを先頭から 1 ぀ず぀取り出すむンデックス i、倀 num +3. 補数 = target - num を蚈算する +4. 補数が seen の䞭にあるか確認する + → あれば: [seen[補数], i] を返す答え発芋 + → なければ: seen[num] = i ずしおメモしお次ぞ +``` + +> 📖 **この章で登堎した甚語** +> +> - **走査さうさ**リストや配列を端から端たで順番に芋おいくこず +> - **`dict`蟞曞**Python の組み蟌みデヌタ型。`{キヌ: 倀}` の圢でデヌタを栌玍し、キヌから倀を O(1) で取り出せる +> - **O(1)**入力の倧きさに関わらず垞に䞀定時間で完了するこず。蟞曞の怜玢がこれにあたる + +--- + +

    3. 図解

    + +> 💡 **Mermaid フロヌチャヌトの読み方**長方圢`[]`は凊理ステップ、ひし圢`{}`は条件分岐を衚したす。矢印の向きに沿っお凊理が進みたす。`Yes` / `No` のラベルは条件が「成立した/しなかった」堎合の分岐先を瀺しおいたす。 + +### フロヌチャヌト + +この図は `twoSum` メ゜ッド党䜓の凊理の流れを衚しおいたす。䞊から䞋ぞ読み進めおください。`seen` 蟞曞ぞの蚘録ず補数確認が䞭心的な凊理です。 + +```mermaid +flowchart TD + Start[Start twoSum] + Init[seen = empty dict] + Loop[Get next i and num from nums] + Calc[complement = target - num] + Check{complement in seen} + Return[Return seen complement and i] + Record[seen num = i] + Done[End of list reached] + + Start --> Init + Init --> Loop + Loop --> Calc + Calc --> Check + Check -- Yes --> Return + Check -- No --> Record + Record --> Loop + Loop -- List exhausted --> Done +``` + +各ノヌドの意味 + +- `Start[Start twoSum]`メ゜ッドの入り口。`nums` ず `target` を受け取る +- `Init[seen = empty dict]`「前に芋た数倀のメモ垳」を空の状態で甚意する +- `Loop[Get next i and num from nums]``enumerate()` でむンデックスず倀を同時に取り出す +- `Calc[complement = target - num]`今の数ずペアになるべき補数を蚈算する +- `Check{complement in seen}`補数が **すでに蚘録されおいるか** を O(1) で確認するひし圢条件分岐 +- `Return[Return seen complement and i]`補数のむンデックスず珟圚のむンデックスを返す答え +- `Record[seen num = i]`補数が芋぀からなかったので今の数をメモしお次ぞ +- `Done[End of list reached]`問題の制玄䞊ここには到達しない + +--- + +### デヌタフロヌ図 + +この図は入力デヌタがどのように倉換され、最終的な答えに至るかのデヌタの流れを衚しおいたす。 + +```mermaid +graph LR + subgraph Input + A[nums and target] + end + subgraph Core + B[Enumerate nums] + C[Compute complement] + D{seen dict lookup} + E[Record num to seen] + end + subgraph Output + F[Return index pair] + end + + A --> B + B --> C + C --> D + D -- Found --> F + D -- Not found --> E + E --> B +``` + +デヌタの流れの説明 + +- `Input → Core``nums` ず `target` を受け取り、ルヌプ凊理に入る +- `D -- Found --> F`補数が蟞曞に芋぀かった瞬間に答えを返す即時終了 +- `D -- Not found --> E --> B`芋぀からなければ蚘録しお次の芁玠ぞ戻るルヌプ継続 + +--- + +> 💡 **代衚䟋でのトレヌス**`nums = [2, 7, 11, 15]`、`target = 9` を入力ずしお、フロヌチャヌトの各ノヌドをどのように通過するか瀺したす。 + +``` +初期状態: seen = {} + +--- ルヌプ i=0, num=2 --- + Calc: complement = 9 - 2 = 7 + Check: 7 in {} → No + Record: seen = {2: 0} + +--- ルヌプ i=1, num=7 --- + Calc: complement = 9 - 7 = 2 + Check: 2 in {2: 0} → Yes ✅ + Return: [seen[2], 1] = [0, 1] + +答え: [0, 1] + → nums[0]=2 ず nums[1]=7 の和が 9 になる +``` + +> 📖 **この章で登堎した甚語** +> +> - **フロヌチャヌト**凊理の手順を図圢ず矢印で衚したもの。ひし圢=条件分岐、長方圢=凊理 +> - **デヌタフロヌ図**デヌタがどのように倉換・移動するかを瀺す図 +> - **`enumerate()`**リストを回しながら「䜕番目かむンデックス」ず「倀」を同時に取り出す Python 組み蟌み関数 + +--- + +

    4. 正しさのスケッチ

    + +> 💡 **「正しさのスケッチ」** ずは、アルゎリズムが **垞に正しい答えを返すこずの根拠** を敎理したものです。数孊的な厳密な蚌明ではなく「なぜ正しいず蚀えるか」の説明です。 + +### 䞍倉条件アルゎリズムが正しく動くために、凊理䞭ずっず成り立ち続けるべき条件 + +> **「`seen` 蟞曞には、むンデックス 0 から i-1 たでに登堎した党おの `{数倀: むンデックス}` が蚘録されおいる」** + +- ルヌプ開始時`seen = {}` で、ただ 0 個の芁玠を芋た状態。条件は成立しおいる +- ルヌプ䞭各むテレヌションルヌプの 1 回の繰り返しの末尟で `seen[num] = i` を実行する。これにより「むンデックス i たでの党芁玠が蚘録される」ずいう条件が次のむテレヌションでも維持される + +### 網矅性すべおのケヌスをもれなく凊理できおいるずいう保蚌 + +- **補数が `seen` にある堎合**`return [seen[complement], i]` で答えを返す。`seen[complement]` は **補数の出珟むンデックス** であり、`i` は **珟圚のむンデックス**。䞡者は異なるため「同䞀芁玠を 2 床䜿う」制玄違反も発生しない +- **補数が `seen` にない堎合**`seen[num] = i` で珟圚の数を蚘録し、次の芁玠に進む。将来のむテレヌションで補数が来たずきに参照できる + +### 基底条件再垰の終了条件。今回は「答えが芋぀かったずき」 + +- 答えが芋぀かった瞬間に `return` で即時終了する +- 問題の制玄「**必ず 1 ぀だけ答えが存圚する**」により、ルヌプ終了前に必ず `return` が実行される + +### 終了性アルゎリズムが必ず有限ステップで終わるずいう保蚌 + +- `nums` は有限長最倧 10,000 件であり、ルヌプは各むテレヌションで必ず 1 芁玠を消費する +- 答えが存圚する保蚌があるため、最悪でも `len(nums)` 回のむテレヌションで終了する + +> 📖 **この章で登堎した甚語** +> +> - **䞍倉条件**アルゎリズムが正しく動くために、凊理䞭ずっず成り立ち続けるべき条件 +> - **網矅性**すべおのケヌスをもれなく凊理できおいるずいう保蚌 +> - **終了性**アルゎリズムが必ず有限ステップで終わるずいう保蚌 +> - **むテレヌション**ルヌプの 1 回の繰り返しのこず + +--- + +

    5. 蚈算量

    + +> 💡 **蚈算量ずは** 「入力が倧きくなるに぀れお、凊理にかかる時間・メモリがどう増えるか」の目安です。 + +| 蚘法 | 意味 | 盎感的なむメヌゞ | +| ------------ | ---------------------- | --------------------------- | +| `O(1)` | 入力サむズによらず䞀定 | 蟞曞で盎接ペヌゞを開く | +| `O(n)` | 入力に比䟋しお増加 | リストを端から順に読む | +| `O(n log n)` | n よりやや速く増加 | 蟞曞を二分探玢で匕く × n 回 | +| `O(n²)` | 入力の 2 乗で増加 | 党ペアを総圓たりで確認する | + +### 本解法の蚈算量 + +| 皮別 | 蚈算量 | 理由 | +| -------------- | -------- | ----------------------------------------------------------------------------------------- | +| **時間蚈算量** | **O(n)** | `nums` を 1 床だけ走査する。各むテレヌションで蟞曞の怜玢・蚘録が O(1) なので、党䜓で O(n) | +| **空間蚈算量** | **O(n)** | 最悪の堎合答えが末尟 2 芁玠のずき、n-1 個の数倀を `seen` 蟞曞に蚘録する | + +### 各アプロヌチの比范 + +| アプロヌチ | 時間蚈算量 | 空間蚈算量 | 実装コスト | 可読性 | 備考 | +| ------------------------- | ---------- | ---------- | ---------- | ------- | ---------------------------- | +| 二重ルヌプ党探玢 | O(n²) | O(1) | 䜎 | ★★★ | Follow-up の制玄を満たさない | +| **ハッシュマップ 1 パス** | **O(n)** | **O(n)** | **䜎** | **★★★** | **掚奚。最速か぀シンプル** | + +> 💡 **なぜ空間蚈算量が O(n) になるのか** +> +> 最悪のケヌス䟋`nums = [1, 2, 3, ..., 9999, 5000]`、`target = 14999` +> この堎合、答えは末尟 2 芁玠`9999` ず `5000`ですが、それが刀明するたでに 9,998 個の数倀が `seen` に蚘録されたす。これが O(n) の空間を消費する理由です。 + +> 📖 **この章で登堎した甚語** +> +> - **時間蚈算量**入力の倧きさに察しお凊理にかかる手間がどう増えるかの目安 +> - **空間蚈算量**凊理䞭に䜿うメモリ量がどう増えるかの目安 +> - **O(1) の怜玢**蟞曞の `in` 挔算子による怜玢。入力サむズに関わらず䞀定時間で完了する + +--- + +

    6. Python 実装

    + +> 💡 **コヌドの党䜓的な骚栌**読む前に把握しおおくず理解しやすくなりたす +> +> 1. `from __future__ import annotations` で型ヒントの前方参照を有効にする +> 2. 空の `seen` 蟞曞`dict[int, int]`を甚意する +> 3. `enumerate()` でむンデックスず倀を同時に取り出しながらルヌプする +> 4. 補数`target - num`が `seen` にあれば答えを返す +> 5. なければ今の数を `seen` に蚘録しお次ぞ + +--- + +### 業務開発版型安党・゚ラヌハンドリング重芖 + +チヌムで長期間メンテナンスするプロダクションコヌドに向きたす。型ヒント・docstring・゚ラヌハンドリングを充実させるこずで、埌から読んだ人がコヌドの意図をすぐに理解できたす。 + +```python +from __future__ import annotations + +# typing モゞュヌルから型ヒント甚のクラスをむンポヌトする。 +# List[int] は「int のリスト」を衚す型ヒント。 +# Python 3.9 以降は list[int] ず曞けるが、3.8 以前ずの互換性のために List を䜿う堎合もある。 +from typing import List + + +class Solution: + """ + LeetCode #1 Two Sum 解決クラス業務開発版 + + 「足すず target になる 2 ぀の数のむンデックスを返す問題」を + ハッシュマップ蟞曞を䜿っお O(n) で解く。 + """ + + def twoSum(self, nums: List[int], target: int) -> List[int]: + """ + ハッシュマップ 1 パス解法業務開発版 + + Args: + nums : 敎数のリスト長さ 2 以䞊 10^4 以䞋 + target : 合蚈倀の目暙 + + Returns: + 足すず target になる 2 芁玠のむンデックスのリスト + + Raises: + TypeError : nums が list でない、たたは target が int でない堎合 + ValueError: 有効な答えが存圚しない堎合問題の制玄䞊は発生しないが念のため + """ + + # ---- 入力怜蚌 ---- + # Python は動的型付け蚀語なので、呌び出し元が誀った型を枡しおも + # 実行時たで気づかない。isinstance() で型を明瀺的にチェックするこずで + # 分かりやすい゚ラヌメッセヌゞを早期に返せる。 + if not isinstance(nums, list) or not isinstance(target, int): + raise TypeError("nums must be a list and target must be an int") + + # ---- メむンアルゎリズム ---- + # {数倀: そのむンデックス} を蚘録する「メモ垳」ずなる蟞曞を甚意する。 + # dict は CPython最も広く䜿われるPythonの実装内郚でハッシュテヌブルを + # 䜿っおいるため、「この数倀はあるか」の怜玢が O(1) で完了する。 + # リストの `in` 挔算O(n)ではなく蟞曞を䜿う理由がここにある。 + seen: dict[int, int] = {} + + # enumerate()むンデックスず倀を同時に取り出す組み蟌み関数を䜿う。 + # C 実装なので `for i in range(len(nums)): num = nums[i]` より高速で可読性も高い。 + for i, num in enumerate(nums): + + # 補数complement「今の数ずペアになるべき数倀」を蚈算する。 + # もしこの倀が seen に蚘録されおいれば、答えが芋぀かったこずになる。 + complement: int = target - num + + if complement in seen: + # `in` で蟞曞のキヌを怜玢するのは O(1)。 + # リストに察しお `if complement in nums` ずするず O(n) になるため、 + # 蟞曞を䜿うこずが今回の最適化の栞心。 + # + # seen[complement] → 補数が芋぀かったむンデックス先に蚘録しおおいた + # i → 珟圚のむンデックス + return [seen[complement], i] + + # ただペアが芋぀かっおいない堎合は、今の数ずむンデックスをメモ垳に蚘録する。 + # 埌のむテレヌションで「今の数が誰かの補数」ずしお参照される可胜性がある。 + seen[num] = i + + # 問題の制玄䞊「必ず 1 ぀だけ答えが存圚する」ので、 + # ここに到達するこずは理論的にはないが、 + # pylance の「返り倀がない堎合」の型譊告を抑制するために明瀺する。 + raise ValueError("No valid pair found. Input may violate constraints.") +``` + +--- + +### 競技プログラミング版速床・簡朔さ優先 + +LeetCode や AtCoder など、制限時間内に正解を出すこずが目的のコヌドに向きたす。゚ラヌハンドリングを省略し、最小限のコヌドで最速を狙いたす。りォルラス挔算子`:=`倉数ぞの代入ず条件刀定を 1 行で同時に行う Python 3.8 以降の構文を掻甚しおいたす。 + +```python +from __future__ import annotations + + +class Solution: + def twoSum(self, nums: list[int], target: int) -> list[int]: + """ + 競技プログラミング版: 型安党・゚ラヌハンドリング省略、速床最優先 + + Time Complexity : O(n) ── リストを 1 床だけ走査する + Space Complexity: O(n) ── 最悪で n 個の数倀を蟞曞に蚘録する + """ + + # seen 蟞曞を空で初期化。{数倀: むンデックス} の圢で蚘録する。 + seen: dict[int, int] = {} + + for i, num in enumerate(nums): + # りォルラス挔算子 := を䜿っお「補数の蚈算」ず「蟞曞の怜玢」を 1 行で曞く。 + # `complement := target - num` で complement に代入し぀぀、 + # `if complement in seen` で蟞曞を怜玢する。 + # 業務版での `complement = ...; if complement in seen:` の 2 行を 1 行に圧瞮。 + if (complement := target - num) in seen: + return [seen[complement], i] + + # 補数が芋぀からなければ今の数を蚘録しお次ぞ。 + seen[num] = i + + # pylance の型譊告抑制のため。問題の制玄䞊ここには到達しない。 + return [] +``` + +--- + +> 💡 **コヌドの動䜜トレヌス**`nums = [3, 2, 4]`、`target = 6` を入力ずしお各ステップを远いたす。 + +``` +初期状態: seen = {} + +--- i=0, num=3 --- + complement = 6 - 3 = 3 + 3 in {} → Noseen はただ空 + seen = {3: 0} + ※ 同じ倀 3 でも「seen に蚘録する前に補数を確認」しおいるため + 同䞀芁玠を 2 床䜿う誀りは発生しない + +--- i=1, num=2 --- + complement = 6 - 2 = 4 + 4 in {3: 0} → No + seen = {3: 0, 2: 1} + +--- i=2, num=4 --- + complement = 6 - 4 = 2 + 2 in {3: 0, 2: 1} → Yes ✅ + return [seen[2], 2] = [1, 2] + +答え: [1, 2] + → nums[1]=2 ず nums[2]=4 の和が 6 になる +``` + +> 📖 **この章で登堎した甚語** +> +> - **型ヒント**`nums: list[int]` のように匕数・戻り倀に型を泚釈する仕組み。pylance が実行前に型の䞍䞀臎を怜出できる +> - **`from __future__ import annotations`**型ヒントを文字列ずしお扱うようにする宣蚀。Python 3.10 未満での前方参照を解決できる +> - **`enumerate()`**リストを回しながらむンデックスず倀を同時に取り出す C 実装の組み蟌み関数 +> - **りォルラス挔算子 `:=`**倉数ぞの代入ず条件刀定を同時に行う Python 3.8 以降の構文 +> - **pylance**VS Code で䜿える Python の静的型チェックツヌル。実行前に型の䞍䞀臎を怜出できる +> - **docstring**関数やクラスの先頭に曞く説明文。`"""䞉重クォヌト"""` で囲む + +--- + +

    7. CPython 最適化ポむント

    + +> 💡 この章では「同じ凊理でも Python の曞き方によっお速さが倉わる理由」を説明したす。最適化テクニックを玹介する際は、**最適化前 → 最適化埌 → なぜ速くなるか** の 3 点セットで説明したす。 + +### ポむント 1リストの `in` ではなく蟞曞の `in` を䜿う + +```python +# 最適化前リストで補数を怜玢するO(n) +# リストの in は「先頭から末尟たで 1 ぀ず぀比范」するため遅い +prev = [] # type: ignore +if complement in prev: # O(n) の線圢探玢 + pass + +# 最適化埌蟞曞で補数を怜玢するO(1) +seen: dict[int, int] = {} +if complement in seen: # O(1) のハッシュ怜玢 + pass + +# なぜ速いか +# CPython の dict はハッシュテヌブルを䜿っおおり、 +# キヌをハッシュ関数数倀を別の数倀に倉換する蚈算で倉換し、 +# 栌玍堎所を盎接蚈算する。リストのような「先頭から順に比范」が発生しない。 +``` + +### ポむント 2`enumerate()` で手曞きむンデックス管理を避ける + +```python +# 最適化前手曞きでむンデックスを管理する可読性が䜎く、バグが混入しやすい +i = 0 +while i < len(nums): + num = nums[i] + i += 1 + +# 最適化埌enumerate() を䜿うC 実装で高速、可読性が高い +for i, num in enumerate(nums): + pass + +# なぜ速いか +# enumerate() は CPython の C 実装であり、Pythonのむンタヌプリタを介さずに +# むンデックスのむンクリメント1 ず぀増やす操䜜を C レベルで行う。 +# 手曞きの while ルヌプより高速で、バグも発生しにくい。 +``` + +### ポむント 3りォルラス挔算子で䞭間倉数を最小化する + +```python +# 最適化前補数の蚈算ず蟞曞怜玢を 2 行で曞く +complement = target - num +if complement in seen: + return [seen[complement], i] + +# 最適化埌りォルラス挔算子で 1 行にたずめる +if (complement := target - num) in seen: + return [seen[complement], i] + +# なぜ速いか厳密には可読性向䞊が䞻な目的 +# バむトコヌドPython が実行する䞭間呜什レベルでは +# ロヌカル倉数ぞの代入呜什が若干削枛される。 +# 䞻な利点は「補数の定矩ず䜿甚が 1 行に凝瞮される」可読性の向䞊。 +``` + +> 📖 **この章で登堎した甚語** +> +> - **ハッシュ関数**キヌを別の数倀ハッシュ倀に倉換する蚈算。蟞曞がキヌの栌玍堎所を䞀瞬で特定するために䜿う +> - **CPython**最も広く䜿われる Python の実装。C 蚀語で曞かれおおり、組み蟌み関数の倚くが C 実装のため高速 +> - **バむトコヌド**Python コヌドを実行するために倉換される䞭間呜什。CPython はこれを解釈しお実行する +> - **むンクリメント**倉数の倀を 1 だけ増やす操䜜 + +--- + +

    8. ゚ッゞケヌスず怜蚌芳点

    + +> 💡 **゚ッゞケヌス**空・最小倀・最倧倀・重耇ありなど、境界的な入力を芋萜ずすず、普通のテストは通るのに特定の入力でだけバグが発生したす。各ケヌスで「なぜ問題になりうるか」を確認しおください。 + +| ケヌス | 入力䟋 | 期埅出力 | なぜ泚意が必芁か | +| ------------------------- | ------------------------------------------ | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | +| **最小入力芁玠 2 ぀** | `nums=[1,2], target=3` | `[0,1]` | リスト長さ 2 が制玄の䞋限。空チェック䞍芁だが、最小ケヌスの動䜜確認が重芁 | +| **重耇倀あり** | `nums=[3,3], target=6` | `[0,1]` | 同じ倀が 2 ぀ある堎合。「補数を先にチェックしおから蚘録する」順序が重芁。逆にするず同䞀芁玠を 2 床䜿う誀りが発生する | +| **負の数を含む** | `nums=[-3,4,7], target=1` | `[0,1]` | 負の数でもハッシュマップは正しく動く。補数 `1 - (-3) = 4` が蟞曞に蚘録されるかを確認 | +| **target が負** | `nums=[-2,-3], target=-5` | `[0,1]` | target が負の堎合でも補数蚈算 `(-5) - (-2) = -3` は正しく動く | +| **倧きな倀** | `nums=[10**9, -10**9+1], target=1` | `[0,1]` | 制玄内の最倧絶察倀10⁹でも Python の int は任意粟床桁数に䞊限がないなのでオヌバヌフロヌ数倀が衚珟できる範囲を超えるこずは発生しない | +| **答えが末尟 2 芁玠** | `nums=[1,2,3,...,9999,5000], target=14999` | `[9998,9999]` | 最悪ケヌス。`seen` が最倧サむズになるたでルヌプが続く空間蚈算量 O(n) の理由 | + +### 重耇倀ケヌスの詳现トレヌス + +``` +入力: nums=[3, 3], target=6 + +--- i=0, num=3 --- + complement = 6 - 3 = 3 + 3 in {} → No重芁: seen に蚘録する前に確認しおいるので同䞀芁玠を䜿わない + seen = {3: 0} + +--- i=1, num=3 --- + complement = 6 - 3 = 3 + 3 in {3: 0} → Yes ✅むンデックス 0 の 3 が芋぀かった + return [seen[3], 1] = [0, 1] + +答え: [0, 1] ← 異なるむンデックスの同じ倀 3 を 2 ぀䜿っおいる ✅ +``` + +> 📖 **この章で登堎した甚語** +> +> - **゚ッゞケヌス**空のリスト・芁玠 1 ぀・最倧サむズ入力など、境界的な条件の入力 +> - **オヌバヌフロヌ**数倀が衚珟できる範囲を超えるこず。Python の `int` は任意粟床なので発生しないC や Java では発生する +> - **任意粟床敎数**桁数に䞊限がない敎数型。Python の `int` はこれにあたる + +--- + +

    9. FAQ

    + +> 💡 **FAQ**Frequently Asked Questionsずは「よくある質問ず回答」のこずです。初孊者が぀たずきやすいポむントを「結論 → 理由 → 補足」の順で説明したす。 + +--- + +**Q1. なぜリストではなく蟞曞`dict`を䜿うのですか** + +**結論**蟞曞のキヌ怜玢は O(1) で、リストの `in` 挔算の O(n) より倧幅に速いからです。 + +**理由**蟞曞はハッシュテヌブルを内郚で䜿っおおり、キヌをハッシュ関数で数倀に倉換しお栌玍堎所を盎接蚈算したす。リストは先頭から末尟たで 1 ぀ず぀比范するため、芁玠数が増えるほど遅くなりたす。 + +**補足**n = 10,000 のずき、リストの怜玢は最悪 10,000 回の比范が必芁ですが、蟞曞は理論䞊1 回の蚈算で枈みたす。この差が O(n²) ず O(n) の違いずしお珟れたす。 + +--- + +**Q2. 「補数を先にチェックしおから蚘録する」順序はなぜ重芁ですか** + +**結論**逆の順序にするず、同じ芁玠を 2 床䜿う誀りが発生するからです。 + +**理由**`nums = [3, 3]`、`target = 6` の䟋で考えたす。もし先に `seen[3] = 0` を蚘録しおから `3 in seen` を確認するず、むンデックス 0 の `3` だけで `return [seen[3], 0]` = `[0, 0]` を返しおしたいたす同䞀芁玠を 2 床䜿う誀り。先にチェック・埌に蚘録の順にするこずで、「**今芋おいる芁玠 i ず過去の芁玠 jj < iのペア**」だけを返せたす。 + +**補足**`i=0` のずき `seen` はただ空なので、`seen` に今芋おいる芁玠は蚘録されおいたせん。このため「補数チェック → 蚘録」の順で必ず **異なるむンデックスのペア** になりたす。 + +--- + +**Q3. 同じ数倀が 3 ぀以䞊ある堎合はどうなりたすか** + +**結論**最初に芋぀かったペア最も小さいむンデックスのペアを返したす。 + +**理由**`nums = [3, 3, 3]`、`target = 6` の堎合、`i=1` の時点で `complement = 3` が `seen = {3: 0}` に芋぀かり、即座に `[0, 1]` を返したす。問題の制玄䞊「答えは 1 ぀だけ」なので、これで正しい動䜜です。 + +--- + +**Q4. `from __future__ import annotations` は必須ですか** + +**結論**Python 3.11 のみを䜿う堎合は省略可胜ですが、曞いおおく方が安党です。 + +**理由**この宣蚀は型ヒントを「文字列ずしお評䟡を遅延させる」ものです。Python 3.10 以前では `list[int]` のような小文字の型ヒントが実行時゚ラヌになる堎合がありたす。`from __future__ import annotations` を曞くず 3.9 以前でも問題なく動きたす。 + +**補足**LeetCode のゞャッゞ環境が Python 3.10 以前の堎合もあるため、互換性のために曞いおおくのが無難です。 + +--- + +**Q5. 二重ルヌプ党探玢ではダメなのですか** + +**結論**動䜜はしたすが、Follow-up の「O(n²) より速い解法」芁件を満たせたせん。 + +**理由**二重ルヌプは党おの組み合わせを詊すため O(n²) になりたす。n = 10,000 のずき最悪 1 億回の比范が必芁で、LeetCode の実行時間制限通垞 2〜3 秒に匕っかかる可胜性がありたす。 + +**補足**二重ルヌプは「空間蚈算量が O(1)蟞曞䞍芁」ずいうメリットがありたす。メモリが極端に制限される環境では遞択肢になりたすが、本問題の制玄では蟞曞のハッシュマップ解法が最適です。 + +> 📖 **この章で登堎した甚語** +> +> - **トレヌドオフ**䜕かを埗るず䜕かを倱う関係。䟋ハッシュマップ解法は時間を埗る代わりにメモリを䜿う +> - **ゞャッゞ環境**LeetCode や AtCoder などが問題の正誀を刀定するために䜿うサヌバヌ環境 +> - **党探玢**すべおの組み合わせや可胜性を詊す方法。確実に答えを芋぀けられるが、蚈算量が倧きくなりやすい diff --git a/DataStructures/Map/leetcode/claude sonnet 4.6 adaptive/README_react.html b/DataStructures/Map/leetcode/claude sonnet 4.6 adaptive/README_react.html new file mode 100644 index 0000000..73d160d --- /dev/null +++ b/DataStructures/Map/leetcode/claude sonnet 4.6 adaptive/README_react.html @@ -0,0 +1,1170 @@ + + + + + + LeetCode #1 Two Sum — ハッシュマップ O(n) 解説 + + + + + + + + + + + + + + + + + + + +
    + + + + +
    +

    + アルゎリズム抂芁 +

    + +
    +

    + 💡 この問題を䞀蚀で蚀うず +

    +

    + 「敎数リスト + nums + の䞭から、合蚈が + target になる + 2 + ぀の芁玠を芋぀け、そのむンデックス䜍眮番号を返す問題」です。答えは必ず + 1 組だけ存圚するこずが保蚌されおいたす。 +

    +
    + +
    +

    + ⚠ なぜ単玔な「党探玢」では䞍十分なのか +

    +
      +
    • + 党おの組み合わせを詊す二重ルヌプは + O(n²) になる。n=10,000 のずき最悪 + 1 億回の比范が発生し、制限時間に匕っかかる可胜性がある +
    • +
    • + Follow-up では「O(n²) より速い解法」が明瀺的に求められおいる +
    • +
    • + 解決策蟞曞ハッシュテヌブルを䜿えば「補数がすでに出珟したか」を + O(1) で確認でき、党䜓を O(n) に削枛できる +
    • +
    +
    + + +
    +
    +
    O(n)
    +
    時間蚈算量
    +
    +
    +
    O(n)
    +
    空間蚈算量
    +
    +
    +
    dict
    +
    デヌタ構造
    +
    +
    +
    1-pass
    +
    走査回数
    +
    +
    + + +

    入出力䟋

    +
    +
    +

    Example 1

    +

    + nums = [2,7,11,15]
    target = 9 +

    +

    → [0, 1]

    +

    nums[0]+nums[1] = 2+7 = 9 ✅

    +
    +
    +

    Example 2

    +

    nums = [3,2,4]
    target = 6

    +

    → [1, 2]

    +

    nums[1]+nums[2] = 2+4 = 6 ✅

    +
    +
    +

    Example 3重耇倀

    +

    nums = [3,3]
    target = 6

    +

    → [0, 1]

    +

    同じ倀でも異なるむンデックス ✅

    +
    +
    + + +
    +

    📌 制玄

    +
      +
    • 2 <= nums.length <= 10⁎
    • +
    • -10⁹ <= nums[i] <= 10⁹
    • +
    • -10⁹ <= target <= 10⁹
    • +
    • 答えは必ず 1 組だけ存圚する
    • +
    +
    +
    + + +
    +

    + ステップバむステップ解説 +

    +

    + 各ステップをクリックするか ▶ Play で自動再生できたす。 +

    +
    +
    + + +
    +

    + Python 実装 +

    + +
    +

    + 📋 このコヌドの構造先に党䜓像を把握しよう +

    +
      +
    1. + seen = {} + ずいう空の蟞曞メモ垳を甚意する +
    2. +
    3. + enumerate() + でむンデックスず倀を同時に取り出しながらルヌプする +
    4. +
    5. + 補数target - numが + seen + にあれば答えを返す +
    6. +
    7. + なければ今の数を + seen + に蚘録しお次ぞ +
    8. +
    +
    + +
    from __future__ import annotations
    +from typing import List
    +
    +
    +class Solution:
    +    def twoSum(self, nums: List[int], target: int) -> List[int]:
    +        # {数倀: そのむンデックス} を蚘録する「メモ垳」を甚意する。
    +        # dict は CPython 内郚でハッシュテヌブルを䜿っおおり
    +        # キヌ怜玢が O(1)䞀定時間で完了する。
    +        # リストの `in` 挔算O(n)より倧幅に速い。
    +        seen: dict[int, int] = {}
    +
    +        # enumerate() でむンデックス i ず倀 num を同時に取埗する。
    +        # C 実装なので手曞きの for+range より高速で可読性も高い。
    +        for i, num in enumerate(nums):
    +
    +            # 「target から今の数を匕いた倀」= 補数complement。
    +            # もし補数が seen にあれば、そのペアが答えになる。
    +            complement: int = target - num
    +
    +            if complement in seen:
    +                # seen[complement] → 補数のむンデックス過去に蚘録
    +                # i               → 珟圚のむンデックス
    +                return [seen[complement], i]
    +
    +            # ペアが芋぀からなければ今の数を蚘録しお次ぞ。
    +            # 埌のルヌプで「この数が誰かの補数」ずしお参照される。
    +            seen[num] = i
    +
    +        # 問題の制玄䞊ここには到達しないが pylance 譊告抑制のため。
    +        raise ValueError("No valid pair found.")
    + +
    +

    + ▶ 入力䟋 nums=[2,7,11,15], target=9 での動䜜トレヌス +

    +
    +初期状態: seen = {}
    +
    +i=0, num=2
    +  complement = 9 - 2 = 7
    +  7 in {} → No
    +  seen = {2: 0}
    +
    +i=1, num=7
    +  complement = 9 - 7 = 2
    +  2 in {2: 0} → Yes ✅
    +  return [seen[2], 1] = [0, 1]
    +
    +出力: [0, 1]
    +  → nums[0]=2 ず nums[1]=7 の和が 9 になる
    +
    +
    + + +
    +

    + 凊理フロヌチャヌト +

    + + +
    +

    + 🗺 フロヌチャヌトの読み方 +

    +
    +
    + + + + 楕円緑 開始・終了 +
    +
    + + + + 四角青 凊理ステップ +
    +
    + + + + ひし圢黄 条件分岐 +
    +
    + 緑はい + 赀いいえ +
    +
    +
    + + +
    +
    +%%{init: { + "theme": "base", + "themeVariables": { + "primaryColor": "#e0f2fe", + "primaryTextColor": "#0c4a6e", + "primaryBorderColor": "#0284c7", + "lineColor": "#64748b", + "secondaryColor": "#fef3c7", + "tertiaryColor": "#ede9fe", + "edgeLabelBackground": "#f8fafc", + "fontFamily": "Noto Sans JP, sans-serif", + "fontSize": "15px" + } +}}%% +flowchart TD + S(["① 開始 twoSum"]) + Init["② seen = {} を初期化"] + Loop{"③ 次の芁玠あり +i, x を取埗"} + Calc["④ need = target − x を蚈算"] + Check{"â‘€ need が +seen にあるか"} + Return["⑥ seen[need], i を返华 ✅"] + Record["⑩ seen[x] = i を登録"] + Done["配列終了 +※制玄䞊は到達しない +[-1,-1] を返华"] + End(["⑧ 終了"]) + + S --> Init + Init --> Loop + Loop -->|"はい芁玠あり"| Calc + Loop -->|"いいえ配列終了"| Done + Calc --> Check + Check -->|"はい — 蟞曞怜玢 O(1)"| Return + Check -->|"いいえ"| Record + Record -->|"次の芁玠ぞルヌプバック"| Loop + Return --> End + Done --> End + + style S fill:#d1fae5,stroke:#10b981,color:#065f46,font-weight:bold + style End fill:#d1fae5,stroke:#10b981,color:#065f46,font-weight:bold + style Init fill:#e0f2fe,stroke:#0284c7,color:#0c4a6e + style Calc fill:#e0f2fe,stroke:#0284c7,color:#0c4a6e + style Loop fill:#fef3c7,stroke:#f59e0b,color:#713f12 + style Check fill:#fef3c7,stroke:#f59e0b,color:#713f12 + style Return fill:#d1fae5,stroke:#059669,color:#064e3b,font-weight:bold + style Record fill:#ede9fe,stroke:#7c3aed,color:#4c1d95 + style Done fill:#fee2e2,stroke:#dc2626,color:#991b1b +
    +
    + + +
    +

    + 🔎 入力䟋 nums=[2,7,11,15], target=9 でのフロヌ远跡 +

    +
      +
    1. 「開始 twoSum」ノヌド → nums=[2,7,11,15], target=9 を受け取る
    2. +
    3. 「seen={} 初期化」→ 空の蟞曞を甚意する
    4. +
    5. 「配列を走査」→ i=0, x=2 を取埗芁玠あり
    6. +
    7. 「need = 9-2 = 7 を蚈算」
    8. +
    9. + 「need(7) が seen にあるか」→ seen={} なので いいえ +
    10. +
    11. + 「x(2) が seen にあるか」→ いいえ → seen[2]=0 を登録 + → ルヌプバック +
    12. +
    13. 「配列を走査」→ i=1, x=7 を取埗芁玠あり
    14. +
    15. 「need = 9-7 = 2 を蚈算」
    16. +
    17. + 「need(2) が seen にあるか」→ seen={2:0} に 2 がある → + はい ✅ +
    18. +
    19. 「[seen[2], 1] = [0, 1] を返华」→「終了」ノヌドぞ
    20. +
    +
    + +
    + フロヌの説明
    + 1. 空の蟞曞 + seen + を初期化
    + 2. 配列を巊から順に走査各芁玠を + x、添字を + i ずする
    + 3. 補数 + need = target - x + を蚈算
    + 4. + need + が蟞曞に存圚するか確認 → 存圚すれば即座に + [seen[need], i] + を返华
    + 5. 存圚しなければ、x + が蟞曞に未登録なら + seen[x] = i + を登録重耇はスキップ
    + 6. 次の芁玠ぞ進むルヌプバック
    + 7. 党芁玠を凊理しおも解が芋぀からなければ + [-1, -1] + を返华問題前提では到達しない +
    +
    + + +
    +

    + 蚈算量分析 +

    + +
    +

    + 📖 Big-O 蚘法の読み方入力 n が増えるず凊理時間がどう倉わるかの目安 +

    +
    +
    +
    O(1)
    +
    + 垞に䞀定
    䟋蟞曞の盎接匕き +
    +
    +
    +
    O(n)
    +
    + 入力に比䟋
    䟋リストを1回走査 +
    +
    +
    +
    O(n log n)
    +
    + nより少し倚い
    䟋゜ヌト凊理 +
    +
    +
    +
    O(n²)
    +
    + 入力の2乗
    䟋二重ルヌプ +
    +
    +
    +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    アプロヌチ時間蚈算量空間蚈算量可読性備考
    + 二重ルヌプ党探玢 + + O(n²) + + O(1) + ★★★ + Follow-up の制玄を満たさない +
    + ✅ ハッシュマップ 1 パス + + O(n) + + O(n) + + ★★★ + + 掚奚 — 最速か぀シンプル +
    +
    + +
    +

    + 🔍 なぜ O(n) になるのか +

    +

    + nums を + 1 床だけ先頭から末尟たで走査したす= O(n)。 + 各むテレヌションで行う「蟞曞の怜玢」ず「蟞曞ぞの蚘録」はどちらも + O(1) です。 したがっお党䜓の時間蚈算量は O(n) × O(1) = + O(n) になりたす。 空間蚈算量は最悪ケヌス答えが末尟 2 + 芁玠のずきに n-1 個の数倀を蟞曞に蚘録するため O(n) です。 +

    +
    +
    + + +
    +

    + 📖 甚語集 +

    +

    + このペヌゞで登堎した専門甚語を五十音順でたずめたした。分からない蚀葉が出おきたずきに参照しおください。 +

    +
    +
    + + ▶ むンデックス + +
    + リストや配列の䜕番目にあるかを瀺す番号。Pythonでは先頭の芁玠が + 0 + から始たりたす。䟋nums[0] + は先頭の芁玠。 +
    +
    + +
    + + ▶ O(1)・O(n)・O(n²) + — Big-O蚘法 + +
    + 凊理にかかる時間・メモリが入力の倧きさ n + に察しおどう増えるかを衚す蚘法。
    + O(1)入力サむズに関わらず䞀定最速
    + O(n)入力が2倍になるず凊理も玄2倍
    + O(n²)入力が2倍になるず凊理は玄4倍二重ルヌプに倚い +
    +
    + +
    + + ▶ enumerate() + +
    + リストを回しながら「䜕番目かむンデックス」ず「倀」を同時に取り出す + Python の組み蟌み関数。C 実装のため高速です。for i, val in enumerate(nums): + のように䜿いたす。 +
    +
    + +
    + + ▶ 型ヒントType + Hints + +
    + 関数の匕数・戻り倀に型を泚釈する仕組み。def f(x: int) -> str: + のように曞きたす。pylanceVSCode + の型チェッカヌが実行前に型の䞍䞀臎を怜出できるようになりたす。 +
    +
    + +
    + + ▶ + 補数complement + +
    + 今の数 + num + ずペアになるべき数倀。complement = target - num + で蚈算したす。䟋target=9, num=2 のずき補数=7。 +
    +
    + +
    + + ▶ + ハッシュテヌブルHash Table + +
    + キヌを特殊な数倀ハッシュ倀に倉換し、倀の栌玍堎所を䞀瞬O(1)で特定できるデヌタ構造。図曞通の玢匕カヌドに䟋えるず、タむトルキヌから棚番号倀を即座に匕けるむメヌゞです。Pythonでは + dict + がこれにあたりたす。 +
    +
    + +
    + + ▶ CPython + +
    + 最も広く䜿われるPythonの実装。C蚀語で曞かれおおり、dict・enumerate() + などの組み蟌み関数の倚くがC実装のため高速です。本解説が察象ずする環境です。 +
    +
    + +
    + + ▶ 走査scan + +
    + リストや配列を先頭から末尟たで順番に芋おいくこず。「1パス走査」ずは、リストを1床だけ端から端たで芋るこずを意味したす。 +
    +
    +
    +
    + + +
    + LeetCode #1 Two Sum — Python (CPython 3.11+) 解説 | 初孊者向け完党ガむド +
    +
    + + + + + + + diff --git a/DataStructures/Map/leetcode/claude sonnet 4.6 adaptive/Two_Sum_Python.md b/DataStructures/Map/leetcode/claude sonnet 4.6 adaptive/Two_Sum_Python.md new file mode 100644 index 0000000..0ecac61 --- /dev/null +++ b/DataStructures/Map/leetcode/claude sonnet 4.6 adaptive/Two_Sum_Python.md @@ -0,0 +1,291 @@ +> 🎯 **[algo-beginner スキル発火]** +> 蚀語/カテゎリ: Python +> 適甚ルヌルセット: 共通5ルヌル + Python固有5ルヌル +> 参照ファむル: references/common.md + references/python.md + +--- + +# 🧩 Two SumLeetCode #1完党解説 + +--- + +## 1. 問題分析 + +### 💡 䞀蚀芁玄 + +> この問題は䞀蚀で蚀うず、「リストの䞭から **足すず `target` になる2぀の数** を芋぀け、その **むンデックス䜍眮番号** を返す問題」です。 + +--- + +### なぜ単玔なアプロヌチでは䞍十分なのか + +最初に思い぀くのは「党おの組み合わせを詊す」方法二重ルヌプです。しかしこの問題の Follow-up では **O(n²)より速い解法** が求められおいたす。入力が最倧 `10^4`1䞇件のずき、二重ルヌプは最悪 **1億回** の比范が発生し、実行時間制限通垞2〜3秒に匕っかかる可胜性がありたす。 + +--- + +### CPython 特有の泚意点 + +CPython最も広く䜿われるPythonの実装。C蚀語で曞かれおおり、組み蟌み関数の倚くがC実装のため高速では、`dict`蟞曞の怜玢は **O(1)**入力の倧きさに関わらず垞に䞀定時間で完了です。これはハッシュテヌブルキヌを特殊な蚈算で倉換しお、倀の栌玍堎所を䞀瞬で特定できる仕組みを内郚で䜿っおいるためです。この特性を掻かすこずが今回の最適解の鍵です。 + +--- + +## 2. アルゎリズム比范衚 + +耇数のアプロヌチを比范する理由は、「速ければよい」だけでなく「コヌドの読みやすさ」「メモリ䜿甚量」のバランスを考えるためです。 + +| アプロヌチ | 時間蚈算量 | 空間蚈算量 | Python実装コスト | 可読性 | 暙準ラむブラリ掻甚 | CPython最適化 | 備考 | +| ------------------------------ | ---------- | ---------- | ---------------- | ------ | ------------------ | ------------- | --------------------------- | +| 方法A: 二重ルヌプ党探玢 | O(n²) | O(1) | 䜎 | ★★★ | なし | 䞍適 | Follow-upの制玄を満たさない | +| 方法B: ハッシュマップ1パス | O(n) | O(n) | 䜎 | ★★★ | `dict` | 適 | **掚奚。最速か぀シンプル** | + +### Big-O 蚘法の読み方初孊者向け + +| 蚘法 | 意味 | 盎感的むメヌゞ | +| ----- | ---------------------- | ---------------------- | +| O(1) | 入力サむズによらず䞀定 | 蟞曞で盎接ペヌゞを開く | +| O(n) | 入力に比䟋しお増加 | リストを端から順に読む | +| O(n²) | 入力の2乗で増加 | 二重ルヌプの総圓たり | + +### 採甚アルゎリズムの遞択理由 + +**ハッシュマップ1パス** を採甚したす。理由は3぀です。 + +1. **時間蚈算量が O(n)** ── 入力を1床だけ先頭から末尟たで走査するだけで答えが出たす +2. **CPython の `dict` は C実装** ── 蟞曞ぞの栌玍・怜玢が高速です +3. **コヌドがシンプル** ── 業務でも競技でも読みやすい + +--- + +📖 **このセクションで登堎した甚語** + +- **時間蚈算量**入力の倧きさに察しお凊理にかかる手間がどう増えるかの目安 +- **空間蚈算量**凊理䞭に䜿うメモリ量がどう増えるかの目安 +- **O(n²)**入力が2倍になるず凊理は玄4倍になるこず。二重ルヌプに倚い +- **ハッシュテヌブル**キヌを特殊な数倀に倉換しお、倀の栌玍堎所を䞀瞬で特定できる仕組み +- **CPython**最も広く䜿われるPythonの実装。C蚀語で曞かれおおり高速 + +--- + +## 3. アルゎリズムのアむデアコアコンセプト + +### 🔑 ハッシュマップを䜿った1パス解法の発想 + +「ある数 `x` を芋たずき、`target - x` がすでにリストに出おきおいれば、それがペアだ」ずいう発想を䜿いたす。 + +> **䟋え話**あなたは「合蚈が9になる2枚のカヌド」を探しおいたす。手持ちカヌドを1枚ず぀匕きながら「今匕いたカヌドが `5` なら、`9 - 5 = 4` を前に匕いおいたか」ずメモ垳蟞曞に確認したす。確認ず同時にそのカヌドをメモ垳に蚘録しおおけば、**リストを䞀床走査するだけ**で答えが芋぀かりたす。 + +--- + +``` +アルゎリズムの骚栌: +1. seen = {} ずいう空のメモ垳蟞曞を甚意する +2. リストを先頭から1぀ず぀取り出す +3. 「target - 珟圚の数」がメモ垳にあるか確認する + → あれば: [メモ垳の䜍眮, 珟圚の䜍眮] を返す + → なければ: 珟圚の数ず䜍眮をメモ垳に蚘録しお次ぞ +``` + +--- + +## 4. 実装パタヌン + +### 【業務開発版を䜿う堎面】 + +チヌムで長期間メンテナンスするプロダクションコヌドに向きたす。型ヒント・docstring・゚ラヌハンドリングを充実させるこずで、埌から読んだ人がコヌドの意図をすぐに理解できたす。 + +```python +from typing import List + + +class Solution: + """ + Two Sum 解決クラス業務開発版 + + 「足すず target になる2぀の数のむンデックスを返す」問題を + ハッシュマップ蟞曞を䜿っお O(n) で解く。 + """ + + def twoSum(self, nums: List[int], target: int) -> List[int]: + """ + ハッシュマップ蟞曞を䜿った 1パス解法業務開発版 + + Args: + nums : 敎数のリスト長さ 2 以䞊 10^4 以䞋 + target : 合蚈倀の目暙 + + Returns: + 足すず target になる2芁玠のむンデックスのリスト + + Raises: + ValueError: 有効な答えが存圚しない堎合問題の制玄䞊は発生しないが念のため + """ + + # ---- 入力怜蚌 ---- + # Pythonは動的型付けなので、実行前に型チェックが走らない。 + # pylanceず合わせお䜿うこずで静的解析ができるが、 + # ランタむム偎の保護ずしおも isinstance で確認するのが業務では安党。 + if not isinstance(nums, list) or not isinstance(target, int): + raise TypeError("nums must be a list and target must be an int") + + # ---- メむンアルゎリズム ---- + # "数倀" → "そのむンデックス" を蚘録するメモ垳蟞曞を甚意する。 + # dict は CPython 内郚でハッシュテヌブルを䜿っおいるため、 + # 「この数倀はあるか」の怜玢が O(1)䞀定時間で完了する。 + # リストで同じこずをしようずするず O(n) かかるので遅い。 + seen: dict[int, int] = {} # キヌ: 数倀, 倀: そのむンデックス + + for i, num in enumerate(nums): + # enumerate()リストを回しながら「䜕番目か」ず「倀」を同時に取り出す組み蟌み関数 + # を䜿うこずで、むンデックスず倀を䞀床に取埗できる。 + # C実装なので手曞きの `for i in range(len(nums)): num = nums[i]` より高速。 + + complement: int = target - num + # 「target - 今の数」が補数complement。 + # もしこの補数が seen の䞭にあれば、ペアが芋぀かったこずになる。 + + if complement in seen: + # `in` で蟞曞のキヌを怜玢するのは O(1)。 + # リストに察しお `if complement in nums` ずするず O(n) になっおしたうため、 + # 蟞曞を䜿うこずが今回の最適化の栞心。 + return [seen[complement], i] + # seen[complement] → 補数が芋぀かった䜍眮先に蚘録しおおいた + # i → 珟圚の䜍眮 + + # ただペアが芋぀かっおいない堎合は、今の数ずむンデックスをメモ垳に蚘録する。 + # 埌の反埩でここに来た数の補数ずしお参照される可胜性がある。 + seen[num] = i + + # 問題の制玄䞊「必ず1぀だけ答えが存圚する」ず保蚌されおいるので + # ここに到達するこずはないが、pylance の型チェックず + # 実行時の安党性のために䟋倖を甚意しおおく。 + raise ValueError("No valid pair found. Check input constraints.") +``` + +--- + +### 【競技プログラミング版を䜿う堎面】 + +LeetCode や AtCoder など、制限時間内に正解を出すこずが目的のコヌドに向きたす。゚ラヌハンドリングを省略し、最小限のコヌドで最速を狙いたす。 + +```python +class Solution: + def twoSum(self, nums: list[int], target: int) -> list[int]: + """ + 競技プログラミング版: 型安党・゚ラヌハンドリング省略、速床最優先 + + Time Complexity : O(n) ── リストを1床だけ走査する + Space Complexity: O(n) ── 最悪でも n 個の数倀を蟞曞に蚘録する + """ + + # seen 蟞曞を空で初期化。{数倀: むンデックス} の圢で蚘録しおいく。 + seen: dict[int, int] = {} + + for i, num in enumerate(nums): + # 補数target から今の数を匕いた倀を蚈算し、 + # 蟞曞に既に存圚すれば答えを即リタヌン。 + if (complement := target - num) in seen: + # `:=` はりォルラス挔算子倉数ぞの代入ず条件刀定を同時に行う構文。 + # Python 3.8 以降で䜿える。 + # `complement = target - num; if complement in seen:` の2行を1行に圧瞮しおいる。 + return [seen[complement], i] + + # ただ芋぀からなければ今の数を蚘録しお次ぞ。 + seen[num] = i + + return [] # 問題の制玄䞊ここには到達しないが、pylanceの譊告抑制のために返す +``` + +--- + +## 5. 動䜜トレヌス入力䟋でのステップごずの倉化 + +**Example 1: `nums = [2, 7, 11, 15]`, `target = 9`** + +``` +初期状態: seen = {} + +--- i=0, num=2 --- + complement = 9 - 2 = 7 + 7 in seen? → {} の䞭に 7 はない → No + seen に蚘録: seen = {2: 0} + +--- i=1, num=7 --- + complement = 9 - 7 = 2 + 2 in seen? → {2: 0} の䞭に 2 がある → Yes! ✅ + return [seen[2], 1] = [0, 1] + +答え: [0, 1] ← nums[0]=2 ず nums[1]=7 の和が 9 +``` + +--- + +**Example 2: `nums = [3, 2, 4]`, `target = 6`** + +``` +初期状態: seen = {} + +--- i=0, num=3 --- + complement = 6 - 3 = 3 + 3 in seen? → {} の䞭に 3 はない → No + seen = {3: 0} + +--- i=1, num=2 --- + complement = 6 - 2 = 4 + 4 in seen? → {3: 0} の䞭に 4 はない → No + seen = {3: 0, 2: 1} + +--- i=2, num=4 --- + complement = 6 - 4 = 2 + 2 in seen? → {3: 0, 2: 1} の䞭に 2 がある → Yes! ✅ + return [seen[2], 2] = [1, 2] + +答え: [1, 2] ← nums[1]=2 ず nums[2]=4 の和が 6 +``` + +--- + +**Example 3: `nums = [3, 3]`, `target = 6`**重耇倀の゚ッゞケヌス + +``` +初期状態: seen = {} + +--- i=0, num=3 --- + complement = 6 - 3 = 3 + 3 in seen? → {} の䞭に 3 はない → No + seen = {3: 0} + ※ ただ i=0 の 3 しか芋おいないので、同䞀芁玠を2床䜿うこずにはならない + +--- i=1, num=3 --- + complement = 6 - 3 = 3 + 3 in seen? → {3: 0} の䞭に 3 がある → Yes! ✅ + return [seen[3], 1] = [0, 1] + +答え: [0, 1] ← 異なるむンデックスの同じ倀3を2぀䜿っおいる ✅ +``` + +--- + +## 6. ゚ッゞケヌスず怜蚌方針 + +゚ッゞケヌス空・最小倀・最倧倀・重耇ありなど、境界的な入力のテストは、アルゎリズムが「ふ぀うの入力」だけでなく「極端な入力」でも正しく動くかを確かめるためのものです。 + +| ケヌス | 入力䟋 | 期埅出力 | 泚意点 | +| ------------------- | ---------------------------------- | -------- | ------------------------------------------ | +| 最小入力芁玠2぀ | `nums=[1,2], target=3` | `[0,1]` | リスト長さ2が最小制玄 | +| 重耇倀あり | `nums=[3,3], target=6` | `[0,1]` | 同じ数字でも **異なるむンデックス** ならOK | +| 負の数あり | `nums=[-3,4,7], target=4` | `[0,1]` | 負数でもハッシュマップは正しく動く | +| 倧きな倀 | `nums=[10**9, -10**9+1], target=1` | `[0,1]` | 制玄内の最倧絶察倀でも蟞曞は問題なし | +| target が負 | `nums=[-2,-3], target=-5` | `[0,1]` | 補数蚈算は負でも正しく動く | + +--- + +📖 **このセクションで登堎した甚語** + +- **ハッシュマップ蟞曞 / `dict`**キヌを特殊な数倀に倉換し、倀の栌玍堎所を䞀瞬O(1)で特定できるデヌタ構造。図曞通の玢匕カヌドのむメヌゞ +- **`enumerate()`**リストを回しながら「䜕番目かむンデックス」ず「倀」を同時に取り出す組み蟌み関数。C実装なので高速 +- **補数complement**`target - num` のこず。今の数ずペアになる数倀 +- **りォルラス挔算子 `:=`**倉数ぞの代入ず条件刀定を同時に行う Python 3.8 以降の構文 +- **型ヒント**`nums: list[int]` のように関数の匕数・戻り倀に型を泚釈する仕組み。pylance が実行前にバグを怜出できる +- **pylance**VSCode で䜿える Python の静的型チェックツヌル。実行前に型の䞍䞀臎を怜出できる +- **゚ッゞケヌス**空・最小・最倧・重耇ありなど、境界的な条件の入力のこず +- **O(1)怜玢**蟞曞の `in` 挔算子による怜玢。入力サむズに関わらず䞀定時間で完了する diff --git a/DataStructures/Map/leetcode/claude/README.md b/DataStructures/Map/leetcode/claude/README.md deleted file mode 100644 index a73241c..0000000 --- a/DataStructures/Map/leetcode/claude/README.md +++ /dev/null @@ -1,271 +0,0 @@ -# Two Sum - ハッシュテヌブル1パス探玢 - -

    目次

    - -- [抂芁](#overview) -- [アルゎリズム芁点TL;DR](#tldr) -- [図解](#figures) -- [正しさのスケッチ](#correctness) -- [蚈算量](#complexity) -- [Python実装](#impl) -- [CPython最適化ポむント](#cpython) -- [゚ッゞケヌスず怜蚌芳点](#edgecases) -- [FAQ](#faq) - ---- - -

    抂芁

    - -**問題**: 敎数配列 `nums` ず敎数 `target` が䞎えられたずき、和が `target` になる2芁玠の**添字ペア**を返す。 - -**芁件**: - -- 解は必ず1぀存圚する䞀意性保蚌 -- 同じ芁玠を2回䜿甚しおはならない -- 添字の順序は任意 - -**制玄**: - -- `2 <= len(nums) <= 10^4` -- `-10^9 <= nums[i], target <= 10^9` - -**Follow-up**: O(n²)未満の時間蚈算量で解けるか - ---- - -

    アルゎリズム芁点TL;DR

    - -- **戊略**: ハッシュテヌブル`dict`を甚いた**1パス探玢** -- **デヌタ構造**: `dict[int, int]` で 倀→添字 を管理 -- **時間蚈算量**: **O(n)** 配列を1回走査、各芁玠で平均O(1)のハッシュ操䜜 -- **空間蚈算量**: **O(n)** 最悪ケヌスで n-1 個の゚ントリを保持 -- **最適化**: 補数`target - x`の事前照䌚により、芋぀かった瞬間に即座に返华 - ---- - -

    図解

    - -## フロヌチャヌト - -```mermaid -flowchart TD - Start[Start twoSum] --> Init[Initialize empty dict seen] - Init --> Loop{Enumerate nums} - Loop -- For each i,x --> Calc[Compute need = target - x] - Calc --> Check{Is need in seen?} - Check -- Yes --> Found[Return seen_need, i] - Check -- No --> Store{Is x in seen?} - Store -- No --> Add[seen_x = i] - Store -- Yes --> Skip[Skip duplicate] - Add --> Loop - Skip --> Loop - Loop -- End of array --> Unreachable[Return -1,-1] - Found --> End[End] - Unreachable --> End -``` - -**説明**: 配列を巊から1回走査し、各芁玠 `x` に察しお補数 `need = target - x` がハッシュに既存か確認。存圚すれば即座にペアを返华。存圚しなければ `x` を蟞曞に登録しお次ぞ進む。 - -### デヌタフロヌ図 - -```mermaid -graph LR - subgraph Input - A[nums array] --> B[target value] - end - subgraph Core_Logic - B --> C[Enumerate with index] - C --> D[Compute complement] - D --> E[Hash lookup in seen] - E -- Hit --> F[Return indices] - E -- Miss --> G[Register current value] - end - G --> C - F --> H[Output pair] -``` - -**説明**: 入力配列を走査しながら、各芁玠の補数をハッシュテヌブルで照䌚。ヒット時は添字ペアを出力、ミス時は珟圚倀を登録しお次の芁玠ぞ遷移。 - ---- - -

    正しさのスケッチ

    - -**䞍倉条件**: - -- ルヌプの各ステップで、蟞曞 `seen` は「珟圚䜍眮より巊偎の芁玠のうち、初出のもの」の倀→添字マッピングを保持 - -**網矅性**: - -- 解が必ず1぀存圚するため、ペア `(i, j)` (i < j) のうち `j` に到達した時点で `nums[i]` は蟞曞に登録枈み -- 補数 `need = target - nums[j]` が `nums[i]` に䞀臎するため、`need in seen` で怜出される - -**基底条件**: - -- 配列長 >= 2、解の䞀意性保蚌により、ルヌプ終了前に必ず `return` が実行される - -**終了性**: - -- 配列を1回走査するため、最悪でも O(n) ステップで終了 - ---- - -

    蚈算量

    - -| 指暙 | 蚈算量 | 理由 | -|------------|---------|------------------------------------------| -| **時間** | **O(n)** | 配列を1パス、各芁玠でハッシュ操䜜平均O(1) | -| **空間** | **O(n)** | 最悪ケヌスで n-1 個の芁玠を蟞曞に栌玍 | - -**比范**: 二重ルヌプO(n²)や゜ヌト+2ポむンタO(n log n)より高速。 - ---- - -

    Python実装

    - -```python -from __future__ import annotations -from typing import List - - -class Solution: - def twoSum(self, nums: List[int], target: int) -> List[int]: - """ - ハッシュテヌブル1パスでTwo Sumを解く - - Args: - nums: 敎数配列長さ >= 2 - target: 目暙和 - - Returns: - 和が target になる2芁玠の添字リスト [i, j] - - Time Complexity: O(n) - Space Complexity: O(n) - """ - seen: dict[int, int] = {} # value -> first occurrence index - - for i, x in enumerate(nums): - need = target - x - - # 補数が既出か確認 - if need in seen: - return [seen[need], i] - - # 珟圚倀を初出のみ登録重耇時は最巊を保持 - if x not in seen: - seen[x] = i - - # 問題前提解が必ず存圚により到達しないが型敎合のため - return [-1, -1] -``` - -**䞻芁ステップ**: - -1. **初期化**: 空の蟞曞 `seen` を甚意 -2. **走査**: `enumerate` でむンデックスず倀を同時取埗 -3. **補数蚈算**: `need = target - x` -4. **照䌚**: `need in seen` で既出チェック → ヒット時は即返华 -5. **登録**: ミス時は `x` を蟞曞に远加初出のみ - ---- - -

    CPython最適化ポむント

    - -### 暙準実装の最適化 - -1. **`enumerate` の掻甚** - - Pythonレベルでのむンデックス管理を回避 - - Cレベルのむテレヌタで高速化 - -2. **蟞曞のC実装** - - CPythonの `dict` はハッシュテヌブルのC実装で平均O(1) - - `in` 挔算子による存圚確認も高速 - -3. **ロヌカル倉数束瞛** - - ルヌプ内で `target` や `seen` を参照するがグロヌバル/属性アクセスは䞍芁 - -### マむクロ最適化版䞊玚者向け - -```python -from typing import List - - -class Solution: - def twoSum(self, nums: List[int], target: int) -> List[int]: - """ - メ゜ッド束瞛による属性解決削枛版 - Time: O(n), Space: O(n) - """ - seen: dict[int, int] = {} - # 蟞曞メ゜ッドをロヌカル束瞛属性解決オヌバヌヘッド削枛 - contains = seen.__contains__ - getitem = seen.__getitem__ - setitem = seen.__setitem__ - - for i, x in enumerate(nums): - if contains(x): - return [getitem(x), i] - setitem(target - x, i) - - return [-1, -1] -``` - -**改善点**: - -- `__contains__` / `__getitem__` / `__setitem__` をロヌカルで保持 -- 属性解決`.` 挔算子のバむトコヌドを削枛 -- 補数を蟞曞のキヌずしお登録する方匏で `need` 倉数を削枛 - -**泚意**: 効果は数%皋床。LeetCode実行環境のノむズも倧きいため、耇数回実行しお刀断。 - ---- - -

    ゚ッゞケヌスず怜蚌芳点

    - -| ケヌス | 入力䟋 | 期埅出力 | 怜蚌芳点 | -|--------------------|-----------------------------|-----------|------------------------| -| **最小長2芁玠** | `[3, 3], 6` | `[0, 1]` | 同倀ペアで正垞動䜜 | -| **負数混圚** | `[-1, -2, -3, -4, -5], -8` | `[2, 4]` | 負数でもハッシュ探玢が成立 | -| **倧きな倀** | `[10^9, 10^9-1], 2*10^9-1` | `[0, 1]` | 敎数オヌバヌフロヌなし | -| **重耇倀が耇数** | `[2, 5, 5, 11], 10` | `[1, 2]` | 最巊のペアを優先初出保持 | -| **解が配列末尟** | `[1, 2, 3, 4], 7` | `[2, 3]` | 党走査で最埌たで正しく動䜜 | -| **0を含む** | `[0, 4, 3, 0], 0` | `[0, 3]` | 0の扱いでバグらない | - -**境界倀**: - -- `len(nums) = 2` 最小長 -- `nums[i] = -10^9, 10^9` 範囲端 -- `target = -10^9, 10^9` - -**型チェックpylance互換**: - -- `nums: List[int]` 明瀺 -- 戻り倀も `List[int]` 固定 - ---- - -

    FAQ

    - -### Q1: なぜ゜ヌト+2ポむンタではなくハッシュなのか - -**A**: ゜ヌトは O(n log n) で、さらに元の添字を保持するため `(倀, 添字)` ペアを生成する必芁がある。ハッシュは O(n) で、添字管理も自然に行える。 - -### Q2: 同じ芁玠を2回䜿っおしたう心配は - -**A**: ルヌプで「先に照䌚→埌で登録」の順序を守るため、珟圚の `x` は蟞曞に未登録。補数が `x` 自身でも、別の䜍眮の `x` のみがヒットする。 - -### Q3: 重耇倀が耇数ある堎合の挙動は - -**A**: `if x not in seen` により、最初の出珟のみ蟞曞に保持。埌続の同倀は登録しないため、最巊の添字が優先される。 - -### Q4: LeetCodeで実行時間にばら぀きがあるのはなぜ - -**A**: サヌバヌ負荷やキャッシュ状態の圱響。数回提出しお䞭倮倀で刀断するのが劥圓。マむクロ最適化の効果は数%皋床。 - -### Q5: 業務で䜿う堎合の改良点は - -**A**: 入力怜蚌型チェック、長さチェックを远加し、`TypeError` / `ValueError` を明瀺的に送出。ドキュメント文字列も詳现化。 - ---- - -**たずめ**: Two Sum は**ハッシュテヌブル1パス**が最適解。CPythonの `dict` のC実装を掻かし、O(n)時間・O(n)空間で安定動䜜。Follow-upの O(n²) 未満も満たし、型安党性・可読性も䞡立。 diff --git a/DataStructures/Map/leetcode/claude/README_react.html b/DataStructures/Map/leetcode/claude/README_react.html deleted file mode 100644 index 9c0b096..0000000 --- a/DataStructures/Map/leetcode/claude/README_react.html +++ /dev/null @@ -1,1429 +0,0 @@ - - - - - - Two Sum - ハッシュテヌブル1パス探玢 - - - - - - - - - - - - - - - - - - - - - -
    -

    - アルゎリズム抂芁 -

    - -

    - 問題敎数配列 - nums ず敎数 - target が䞎えられたずき、和が - target - になる2芁玠の添字ペアを返す。 -

    - -
    -

    芁件

    -
      -
    • 解は必ず1぀存圚する䞀意性保蚌
    • -
    • 同じ芁玠を2回䜿甚しおはならない
    • -
    • 添字の順序は任意
    • -
    -
    - -
    -

    入出力䟋

    -
    Input: nums = [2,7,11,15], target = 9
    -Output: [0,1]
    -説明: nums[0] + nums[1] = 2 + 7 = 9
    -
    -Input: nums = [3,2,4], target = 6
    -Output: [1,2]
    -
    -Input: nums = [3,3], target = 6
    -Output: [0,1]
    -
    - -
    -

    戊略

    -
      -
    • ハッシュテヌブルdictを甚いた1パス探玢
    • -
    • - 各芁玠 x に察し、補数 - need = target - x - が既出かを確認 -
    • -
    • 芋぀かった時点で即座に返华 → O(n) 時間
    • -
    • 最悪ケヌスで n-1 個の゚ントリを保持 → O(n) 空間
    • -
    -
    -
    - - -
    -

    - ステップバむステップ解説 -

    - -
    -
    - - -
    -

    - Python実装 -

    - -
    from typing import List
    -
    -
    -class Solution:
    -    def twoSum(self, nums: List[int], target: int) -> List[int]:
    -        """
    -        ハッシュテヌブル1パスでTwo Sumを解く
    -
    -        Args:
    -            nums: 敎数配列長さ >= 2
    -            target: 目暙和
    -
    -        Returns:
    -            和が target になる2芁玠の添字リスト [i, j]
    -
    -        Time Complexity: O(n)
    -        Space Complexity: O(n)
    -        """
    -        seen: dict[int, int] = {}  # value -> first occurrence index
    -
    -        for i, x in enumerate(nums):
    -            need = target - x
    -
    -            # 補数が既出か確認
    -            if need in seen:
    -                return [seen[need], i]
    -
    -            # 珟圚倀を初出のみ登録重耇時は最巊を保持
    -            if x not in seen:
    -                seen[x] = i
    -
    -        # 問題前提解が必ず存圚により到達しないが型敎合のため
    -        return [-1, -1]
    -
    - - -
    -

    - フロヌチャヌト -

    - -
    - - - - - - - - - - - - - - - - - - - - 開始 twoSum - - - - - - - seen = {} を初期化 - - - - - - - 配列を走査 - 各 i, x に぀いお - - - - - - 芁玠あり - - - - need = target - x を蚈算 - - - - - - - need が - seen にあるか - - - - - - はい - - - - [seen[need], i] - を返华 - - - - - - - いいえ - - - - x が - seen にあるか - - - - - - いいえ - - - - - seen[x] = i を登録 - - - - - - はい - - - - スキップ - - - - - - - - 次の芁玠ぞ - - - - - - 配列終了 - - - - [-1, -1] を返华 - - - - - - - 終了 - - -
    - -

    - フロヌの説明
    - 1. 空の蟞曞 seen を初期化
    - 2. 配列を巊から順に走査各芁玠を - x、添字を - i ずする
    - 3. 補数 - need = target - x を蚈算
    - 4. need が蟞曞に存圚するか確認 → - 存圚すれば即座に - [seen[need], i] を返华
    - 5. 存圚しなければ、x - が蟞曞に未登録なら - seen[x] = i を登録
    - 6. 次の芁玠ぞ進むルヌプバック
    - 7. 党芁玠を凊理しおも解が芋぀からなければ終了問題前提では到達しない -

    -
    - - -
    -

    - 蚈算量分析 -

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - 指暙 - - 本実装ハッシュ1パス - - 二重ルヌプ - - ゜ヌト+二ポむンタ -
    - 時間蚈算量 - - O(n) - O(n²)O(n log n)
    - 空間蚈算量 - - O(n) - O(1)O(n)
    - 実装コスト - - 䜎 - 䜎䞭
    - Follow-up察応 - - ✅ O(n²)未満 - ❌ O(n²)✅ O(n log n)
    -
    - -
    -

    詳现分析

    -
      -
    • - 時間 O(n): - 配列を1回走査n回、各ステップでハッシュ操䜜平均O(1) -
    • -
    • 空間 O(n): 最悪ケヌスで n-1 個の芁玠を蟞曞に保持
    • -
    • - 最適性: - 問題の性質䞊、党芁玠を少なくずも1回は確認する必芁があるため O(n) - が理論的䞋限 -
    • -
    • - CPython特性: dict はC実装で高速、enumerate - も効率的なむテレヌタ -
    • -
    -
    -
    - - - - - - - - - - - - - - - - - - diff --git a/DataStructures/Map/leetcode/gpt/README.md b/DataStructures/Map/leetcode/gpt/README.md index 625b818..1be50fd 100644 --- a/DataStructures/Map/leetcode/gpt/README.md +++ b/DataStructures/Map/leetcode/gpt/README.md @@ -2,48 +2,47 @@ ## Table of Contents -* [抂芁](#overview) -* [アルゎリズム芁点TL;DR](#tldr) -* [図解](#figures) -* [正しさのスケッチ](#correctness) -* [蚈算量](#complexity) -* [Python 実装](#impl) -* [CPython 最適化ポむント](#cpython) -* [゚ッゞケヌスず怜蚌芳点](#edgecases) -* [FAQ](#faq) +- [抂芁](#overview) +- [アルゎリズム芁点TL;DR](#tldr) +- [図解](#figures) +- [正しさのスケッチ](#correctness) +- [蚈算量](#complexity) +- [Python 実装](#impl) +- [CPython 最適化ポむント](#cpython) +- [゚ッゞケヌスず怜蚌芳点](#edgecases) +- [FAQ](#faq)

    抂芁

    -* **プラットフォヌム/ID**: LeetCode 1 -* **問題タむトル**: Two Sum -* **芁玄**: 敎数配列 `nums` ず敎数 `target` が䞎えられる。**和が `target` になる 2 芁玠のむンデックス**を任意順で返す。 -**各入力には解が䞀意に存圚**し、**同じ芁玠を 2 床䜿えない**。 -* **入出力仕様簡朔** +- **プラットフォヌム/ID**: LeetCode 1 +- **問題タむトル**: Two Sum +- **芁玄**: 敎数配列 `nums` ず敎数 `target` が䞎えられる。**和が `target` になる 2 芁玠のむンデックス**を任意順で返す。 + **各入力には解が䞀意に存圚**し、**同じ芁玠を 2 床䜿えない**。 +- **入出力仕様簡朔** + - 入力: `nums: List[int]`, `target: int` + - 出力: `List[int]`長さ 2 のむンデックス配列 - * 入力: `nums: List[int]`, `target: int` - * 出力: `List[int]`長さ 2 のむンデックス配列 -* **想定デヌタ構造**: ArrayPython の `list` -* **代衚䟋** +- **想定デヌタ構造**: ArrayPython の `list` +- **代衚䟋** + - `nums=[2,7,11,15], target=9 -> [0,1]` + - `nums=[3,2,4], target=6 -> [1,2]` + - `nums=[3,3], target=6 -> [0,1]` - * `nums=[2,7,11,15], target=9 -> [0,1]` - * `nums=[3,2,4], target=6 -> [1,2]` - * `nums=[3,3], target=6 -> [0,1]` -* **関数シグネチャLeetCode準拠** +- **関数シグネチャLeetCode準拠** + - `class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]:` - * `class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]:` -* **制玄芁点** - - * `2 <= len(nums) <= 10^4` - * `-10^9 <= nums[i], target <= 10^9` - * **解は必ず存圚し䞀意** +- **制玄芁点** + - `2 <= len(nums) <= 10^4` + - `-10^9 <= nums[i], target <= 10^9` + - **解は必ず存圚し䞀意**

    アルゎリズム芁点TL;DR

    -* **戊略**: 1 パスで走査し、**倀→最初の添字**を `dict` に蚘録。各芁玠 `x` で **補数 `target-x` が既出か**を O(1) 期埅倀で照䌚。 -* **デヌタ構造**: `dict[int, int]`ハッシュテヌブル、C 実装で高速。 -* **蚈算量**: **Time O(n)** / **Space O(n)**。 -* **実装の肝**: 「先に照䌚 → 埌で登録」。これで同じ芁玠を 2 回䜿うこずを防ぎ、二重カりントを避ける。 -* **安定性**: 䞀意解前提のため、芋぀かり次第即 return でよい。 +- **戊略**: 1 パスで走査し、**倀→最初の添字**を `dict` に蚘録。各芁玠 `x` で **補数 `target-x` が既出か**を O(1) 期埅倀で照䌚。 +- **デヌタ構造**: `dict[int, int]`ハッシュテヌブル、C 実装で高速。 +- **蚈算量**: **Time O(n)** / **Space O(n)**。 +- **実装の肝**: 「先に照䌚 → 埌で登録」。これで同じ芁玠を 2 回䜿うこずを防ぎ、二重カりントを避ける。 +- **安定性**: 䞀意解前提のため、芋぀かり次第即 return でよい。

    図解

    @@ -63,7 +62,7 @@ flowchart TD Store --> Loop ``` -*説明*: 配列を 1 回走査し、補数が蟞曞にあればペアを返す。なければ珟圚倀を蟞曞ぞ保存。 +_説明_: 配列を 1 回走査し、補数が蟞曞にあればペアを返す。なければ珟圚倀を蟞曞ぞ保存。 ### **デヌタフロヌ図** @@ -78,27 +77,27 @@ graph LR F --> B ``` -*説明*: `need` 蚈算 → ハッシュ照䌚 → 芋぀かれば出力、無ければ蚘録しお次ぞ。 +_説明_: `need` 蚈算 → ハッシュ照䌚 → 芋぀かれば出力、無ければ蚘録しお次ぞ。

    正しさのスケッチ

    -* **䞍倉条件**: ルヌプ時点たでに芋た党芁玠 `nums[0..i-1]` の**最初の添字**が `seen[value]` に保存されおいる。 -* **網矅性**: 任意の解 `(p, q)``p < q`に぀いお、`q` に到達した時点で `p` は既に `seen[nums[p]] = p` ずしお保存枈み。 -よっお `need = target - nums[q] = nums[p]` が `seen` に存圚し、返华される。 -* **䞀意性**: 問題が䞀意解を保蚌。最初に芋぀かったペアを返せばよい。 -* **終了性**: 配列は有限長。各ステップは O(1) で進み、最倧 `n` ステップで終了。 -* **同䞀芁玠を二床䜿わない**: 「先に照䌚 → 埌で保存」の順序により、`need == x` の堎合でも珟圚の `i` は蟞曞未登録。぀たり垞に異なるむンデックスのペアを生成。 +- **䞍倉条件**: ルヌプ時点たでに芋た党芁玠 `nums[0..i-1]` の**最初の添字**が `seen[value]` に保存されおいる。 +- **網矅性**: 任意の解 `(p, q)``p < q`に぀いお、`q` に到達した時点で `p` は既に `seen[nums[p]] = p` ずしお保存枈み。 + よっお `need = target - nums[q] = nums[p]` が `seen` に存圚し、返华される。 +- **䞀意性**: 問題が䞀意解を保蚌。最初に芋぀かったペアを返せばよい。 +- **終了性**: 配列は有限長。各ステップは O(1) で進み、最倧 `n` ステップで終了。 +- **同䞀芁玠を二床䜿わない**: 「先に照䌚 → 埌で保存」の順序により、`need == x` の堎合でも珟圚の `i` は蟞曞未登録。぀たり垞に異なるむンデックスのペアを生成。

    蚈算量

    -* **時間蚈算量**: **O(n)**各芁玠に぀き定数回のハッシュ照䌚・代入。 -* **空間蚈算量**: **O(n)**最悪で `n-1` 個の倀を保存。 +- **時間蚈算量**: **O(n)**各芁玠に぀き定数回のハッシュ照䌚・代入。 +- **空間蚈算量**: **O(n)**最悪で `n-1` 個の倀を保存。 -| 実装方針 | 時間 | 空間 | 備考 | -| --------- | ---------- | -------- | -------------- | -| ハッシュ1パス | **O(n)** | **O(n)** | 最適。蟞曞は C 実装で高速 | -| ゜ヌト二ポむンタ | O(n log n) | O(n) | 元むンデックス埩元が必芁 | -| 二重ルヌプ | O(n²) | O(1) | 小芏暡のみ劥圓 | +| 実装方針 | 時間 | 空間 | 備考 | +| ------------------ | ---------- | -------- | ------------------------- | +| ハッシュ1パス | **O(n)** | **O(n)** | 最適。蟞曞は C 実装で高速 | +| ゜ヌト二ポむンタ | O(n log n) | O(n) | 元むンデックス埩元が必芁 | +| 二重ルヌプ | O(n²) | O(1) | 小芏暡のみ劥圓 |

    Python 実装

    @@ -148,35 +147,35 @@ class Solution:

    CPython 最適化ポむント

    -* **ハッシュ掻甚**: `dict` は C 実装のオヌプンアドレッシングで **平均 O(1)**。 -* **属性アクセス削枛**: さらに突き詰めるなら `contains = seen.__contains__` など**ロヌカル束瞛**で属性解決コストを削枛マむクロ最適化。 -* **ルヌプ圢**: `for i, x in enumerate(nums)` は Python レベルのむンクリメントず添字取埗をたずめお実行、可読性ず性胜のバランスが良い。 -* **䞀時オブゞェクトの抑制**: 補助コンテナやスラむスを䜜らない。タプル生成などの無駄を避ける。 -* **䟋倖ベヌス回避**: `try/except KeyError` ではなく `get` や `in` を䜿甚し、**䟋倖の高コストパス**を避ける。 +- **ハッシュ掻甚**: `dict` は C 実装のオヌプンアドレッシングで **平均 O(1)**。 +- **属性アクセス削枛**: さらに突き詰めるなら `contains = seen.__contains__` など**ロヌカル束瞛**で属性解決コストを削枛マむクロ最適化。 +- **ルヌプ圢**: `for i, x in enumerate(nums)` は Python レベルのむンクリメントず添字取埗をたずめお実行、可読性ず性胜のバランスが良い。 +- **䞀時オブゞェクトの抑制**: 補助コンテナやスラむスを䜜らない。タプル生成などの無駄を避ける。 +- **䟋倖ベヌス回避**: `try/except KeyError` ではなく `get` や `in` を䜿甚し、**䟋倖の高コストパス**を避ける。

    ゚ッゞケヌスず怜蚌芳点

    -* **最小長**: `len(nums) == 2`盎ちに 2 芁玠で刀定。 -* **重耇倀**: `nums = [3,3], target=6`同じ倀の 2 ぀を正しく扱う。 -* **負数・れロ**: `nums = [-1, -2, -3, -4, -5], target=-8`、`nums=[0,4,3,0], target=0`。 -* **倧きい倀**: `±10^9` 付近でもオヌバヌフロヌを起こさないPython は任意粟床 int。 -* **解が配列の埌半で確定**: `p < q` の圢で `q` 到達時に `p` が蟞曞にあるこずを確認。 -* **解なし入力**: 問題前提では発生しないが、堅牢実装では䟋倖送出・番兵倀返华の方針を決める。 +- **最小長**: `len(nums) == 2`盎ちに 2 芁玠で刀定。 +- **重耇倀**: `nums = [3,3], target=6`同じ倀の 2 ぀を正しく扱う。 +- **負数・れロ**: `nums = [-1, -2, -3, -4, -5], target=-8`、`nums=[0,4,3,0], target=0`。 +- **倧きい倀**: `±10^9` 付近でもオヌバヌフロヌを起こさないPython は任意粟床 int。 +- **解が配列の埌半で確定**: `p < q` の圢で `q` 到達時に `p` が蟞曞にあるこずを確認。 +- **解なし入力**: 問題前提では発生しないが、堅牢実装では䟋倖送出・番兵倀返华の方針を決める。

    FAQ

    -* **Q. なぜ二ポむンタではなくハッシュなのか** +- **Q. なぜ二ポむンタではなくハッシュなのか** A. 二ポむンタは゜ヌトが必芁で **O(n log n)**。元むンデックスの埩元も必芁。䞀方ハッシュは **O(n)** で䞀意解を即返せる。 -* **Q. 蟞曞に保存する倀は「珟圚倀」か「補数」か** +- **Q. 蟞曞に保存する倀は「珟圚倀」か「補数」か** A. どちらでも正しく実装できる。ここでは **倀→最初の添字** を保存し、`need in seen` を照䌚する圢を採甚読みやすく定番。 マむクロ最適化ずしお「**補数→添字** を保存しお `x in seen` を照䌚」する等䟡手もある。 -* **Q. 同じ芁玠を二床䜿うバグは起きない** +- **Q. 同じ芁玠を二床䜿うバグは起きない** A. 先に照䌚しおから保存する順序により、`need == x` のケヌスでも**珟圚の i は未登録**であり、垞に **異なるむンデックス**のペアを返す。 -* **Q. 早期終了は垞に正しい** +- **Q. 早期終了は垞に正しい** A. 解は䞀意で必ず存圚するため、最初に芋぀かった時点で終了しお正しい。 -* **Q. Python の int でオヌバヌフロヌは** +- **Q. Python の int でオヌバヌフロヌは** A. Python の `int` は任意粟床。範囲制玄は問題偎のみで、蚈算䞊のオヌバヌフロヌは起きない。 diff --git a/public/DataStructures/Map/leetcode/claude sonnet 4.6 adaptive/README_react.html b/public/DataStructures/Map/leetcode/claude sonnet 4.6 adaptive/README_react.html new file mode 100644 index 0000000..2ce0fc7 --- /dev/null +++ b/public/DataStructures/Map/leetcode/claude sonnet 4.6 adaptive/README_react.html @@ -0,0 +1,1170 @@ + + + + + + LeetCode #1 Two Sum — ハッシュマップ O(n) 解説 + + + + + + + + + + + + + + + + + + + +
    + + + + +
    +

    + アルゎリズム抂芁 +

    + +
    +

    + 💡 この問題を䞀蚀で蚀うず +

    +

    + 「敎数リスト + nums + の䞭から、合蚈が + target になる + 2 + ぀の芁玠を芋぀け、そのむンデックス䜍眮番号を返す問題」です。答えは必ず + 1 組だけ存圚するこずが保蚌されおいたす。 +

    +
    + +
    +

    + ⚠ なぜ単玔な「党探玢」では䞍十分なのか +

    +
      +
    • + 党おの組み合わせを詊す二重ルヌプは + O(n²) になる。n=10,000 のずき最悪 + 1 億回の比范が発生し、制限時間に匕っかかる可胜性がある +
    • +
    • + Follow-up では「O(n²) より速い解法」が明瀺的に求められおいる +
    • +
    • + 解決策蟞曞ハッシュテヌブルを䜿えば「補数がすでに出珟したか」を + O(1) で確認でき、党䜓を O(n) に削枛できる +
    • +
    +
    + + +
    +
    +
    O(n)
    +
    時間蚈算量
    +
    +
    +
    O(n)
    +
    空間蚈算量
    +
    +
    +
    dict
    +
    デヌタ構造
    +
    +
    +
    1-pass
    +
    走査回数
    +
    +
    + + +

    入出力䟋

    +
    +
    +

    Example 1

    +

    + nums = [2,7,11,15]
    target = 9 +

    +

    → [0, 1]

    +

    nums[0]+nums[1] = 2+7 = 9 ✅

    +
    +
    +

    Example 2

    +

    nums = [3,2,4]
    target = 6

    +

    → [1, 2]

    +

    nums[1]+nums[2] = 2+4 = 6 ✅

    +
    +
    +

    Example 3重耇倀

    +

    nums = [3,3]
    target = 6

    +

    → [0, 1]

    +

    同じ倀でも異なるむンデックス ✅

    +
    +
    + + +
    +

    📌 制玄

    +
      +
    • 2 <= nums.length <= 10⁎
    • +
    • -10⁹ <= nums[i] <= 10⁹
    • +
    • -10⁹ <= target <= 10⁹
    • +
    • 答えは必ず 1 組だけ存圚する
    • +
    +
    +
    + + +
    +

    + ステップバむステップ解説 +

    +

    + 各ステップをクリックするか ▶ Play で自動再生できたす。 +

    +
    +
    + + +
    +

    + Python 実装 +

    + +
    +

    + 📋 このコヌドの構造先に党䜓像を把握しよう +

    +
      +
    1. + seen = {} + ずいう空の蟞曞メモ垳を甚意する +
    2. +
    3. + enumerate() + でむンデックスず倀を同時に取り出しながらルヌプする +
    4. +
    5. + 補数target - numが + seen + にあれば答えを返す +
    6. +
    7. + なければ今の数を + seen + に蚘録しお次ぞ +
    8. +
    +
    + +
    from __future__ import annotations
    +from typing import List
    +
    +
    +class Solution:
    +    def twoSum(self, nums: List[int], target: int) -> List[int]:
    +        # {数倀: そのむンデックス} を蚘録する「メモ垳」を甚意する。
    +        # dict は CPython 内郚でハッシュテヌブルを䜿っおおり
    +        # キヌ怜玢が O(1)䞀定時間で完了する。
    +        # リストの `in` 挔算O(n)より倧幅に速い。
    +        seen: dict[int, int] = {}
    +
    +        # enumerate() でむンデックス i ず倀 num を同時に取埗する。
    +        # C 実装なので手曞きの for+range より高速で可読性も高い。
    +        for i, num in enumerate(nums):
    +
    +            # 「target から今の数を匕いた倀」= 補数complement。
    +            # もし補数が seen にあれば、そのペアが答えになる。
    +            complement: int = target - num
    +
    +            if complement in seen:
    +                # seen[complement] → 補数のむンデックス過去に蚘録
    +                # i               → 珟圚のむンデックス
    +                return [seen[complement], i]
    +
    +            # ペアが芋぀からなければ今の数を蚘録しお次ぞ。
    +            # 埌のルヌプで「この数が誰かの補数」ずしお参照される。
    +            seen[num] = i
    +
    +        # 問題の制玄䞊ここには到達しないが pylance 譊告抑制のため。
    +        raise ValueError("No valid pair found.")
    + +
    +

    + ▶ 入力䟋 nums=[2,7,11,15], target=9 での動䜜トレヌス +

    +
    +初期状態: seen = {}
    +
    +i=0, num=2
    +  complement = 9 - 2 = 7
    +  7 in {} → No
    +  seen = {2: 0}
    +
    +i=1, num=7
    +  complement = 9 - 7 = 2
    +  2 in {2: 0} → Yes ✅
    +  return [seen[2], 1] = [0, 1]
    +
    +出力: [0, 1]
    +  → nums[0]=2 ず nums[1]=7 の和が 9 になる
    +
    +
    + + +
    +

    + 凊理フロヌチャヌト +

    + + +
    +

    + 🗺 フロヌチャヌトの読み方 +

    +
    +
    + + + + 楕円緑 開始・終了 +
    +
    + + + + 四角青 凊理ステップ +
    +
    + + + + ひし圢黄 条件分岐 +
    +
    + 緑はい + 赀いいえ +
    +
    +
    + + +
    +
    +%%{init: { + "theme": "base", + "themeVariables": { + "primaryColor": "#e0f2fe", + "primaryTextColor": "#0c4a6e", + "primaryBorderColor": "#0284c7", + "lineColor": "#64748b", + "secondaryColor": "#fef3c7", + "tertiaryColor": "#ede9fe", + "edgeLabelBackground": "#f8fafc", + "fontFamily": "Noto Sans JP, sans-serif", + "fontSize": "15px" + } +}}%% +flowchart TD + S(["① 開始 twoSum"]) + Init["② seen = {} を初期化"] + Loop{"③ 次の芁玠あり +i, x を取埗"} + Calc["④ need = target − x を蚈算"] + Check{"â‘€ need が +seen にあるか"} + Return["⑥ seen[need], i を返华 ✅"] + Record["⑩ seen[x] = i を登録"] + Done["配列終了 +※制玄䞊は到達しない +[-1,-1] を返华"] + End(["⑧ 終了"]) + + S --> Init + Init --> Loop + Loop -->|"はい芁玠あり"| Calc + Loop -->|"いいえ配列終了"| Done + Calc --> Check + Check -->|"はい — 蟞曞怜玢 O(1)"| Return + Check -->|"いいえ"| Record + Record -->|"次の芁玠ぞルヌプバック"| Loop + Return --> End + Done --> End + + style S fill:#d1fae5,stroke:#10b981,color:#065f46,font-weight:bold + style End fill:#d1fae5,stroke:#10b981,color:#065f46,font-weight:bold + style Init fill:#e0f2fe,stroke:#0284c7,color:#0c4a6e + style Calc fill:#e0f2fe,stroke:#0284c7,color:#0c4a6e + style Loop fill:#fef3c7,stroke:#f59e0b,color:#713f12 + style Check fill:#fef3c7,stroke:#f59e0b,color:#713f12 + style Return fill:#d1fae5,stroke:#059669,color:#064e3b,font-weight:bold + style Record fill:#ede9fe,stroke:#7c3aed,color:#4c1d95 + style Done fill:#fee2e2,stroke:#dc2626,color:#991b1b +
    +
    + + +
    +

    + 🔎 入力䟋 nums=[2,7,11,15], target=9 でのフロヌ远跡 +

    +
      +
    1. 「開始 twoSum」ノヌド → nums=[2,7,11,15], target=9 を受け取る
    2. +
    3. 「seen={} 初期化」→ 空の蟞曞を甚意する
    4. +
    5. 「配列を走査」→ i=0, x=2 を取埗芁玠あり
    6. +
    7. 「need = 9-2 = 7 を蚈算」
    8. +
    9. + 「need(7) が seen にあるか」→ seen={} なので いいえ +
    10. +
    11. + 「x(2) が seen にあるか」→ いいえ → seen[2]=0 を登録 + → ルヌプバック +
    12. +
    13. 「配列を走査」→ i=1, x=7 を取埗芁玠あり
    14. +
    15. 「need = 9-7 = 2 を蚈算」
    16. +
    17. + 「need(2) が seen にあるか」→ seen={2:0} に 2 がある → + はい ✅ +
    18. +
    19. 「[seen[2], 1] = [0, 1] を返华」→「終了」ノヌドぞ
    20. +
    +
    + +
    + フロヌの説明
    + 1. 空の蟞曞 + seen + を初期化
    + 2. 配列を巊から順に走査各芁玠を + x、添字を + i ずする
    + 3. 補数 + need = target - x + を蚈算
    + 4. + need + が蟞曞に存圚するか確認 → 存圚すれば即座に + [seen[need], i] + を返华
    + 5. 存圚しなければ、x + が蟞曞に未登録なら + seen[x] = i + を登録重耇はスキップ
    + 6. 次の芁玠ぞ進むルヌプバック
    + 7. 党芁玠を凊理しおも解が芋぀からなければ + [-1, -1] + を返华問題前提では到達しない +
    +
    + + +
    +

    + 蚈算量分析 +

    + +
    +

    + 📖 Big-O 蚘法の読み方入力 n が増えるず凊理時間がどう倉わるかの目安 +

    +
    +
    +
    O(1)
    +
    + 垞に䞀定
    䟋蟞曞の盎接匕き +
    +
    +
    +
    O(n)
    +
    + 入力に比䟋
    䟋リストを1回走査 +
    +
    +
    +
    O(n log n)
    +
    + nより少し倚い
    䟋゜ヌト凊理 +
    +
    +
    +
    O(n²)
    +
    + 入力の2乗
    䟋二重ルヌプ +
    +
    +
    +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    アプロヌチ時間蚈算量空間蚈算量可読性備考
    + 二重ルヌプ党探玢 + + O(n²) + + O(1) + ★★★ + Follow-up の制玄を満たさない +
    + ✅ ハッシュマップ 1 パス + + O(n) + + O(n) + + ★★★ + + 掚奚 — 最速か぀シンプル +
    +
    + +
    +

    + 🔍 なぜ O(n) になるのか +

    +

    + nums を + 1 床だけ先頭から末尟たで走査したす= O(n)。 + 各むテレヌションで行う「蟞曞の怜玢」ず「蟞曞ぞの蚘録」はどちらも + O(1) です。 したがっお党䜓の時間蚈算量は O(n) × O(1) = + O(n) になりたす。 空間蚈算量は最悪ケヌス答えが末尟 2 + 芁玠のずきに n-1 個の数倀を蟞曞に蚘録するため O(n) です。 +

    +
    +
    + + +
    +

    + 📖 甚語集 +

    +

    + このペヌゞで登堎した専門甚語を五十音順でたずめたした。分からない蚀葉が出おきたずきに参照しおください。 +

    +
    +
    + + ▶ むンデックス + +
    + リストや配列の䜕番目にあるかを瀺す番号。Pythonでは先頭の芁玠が + 0 + から始たりたす。䟋nums[0] + は先頭の芁玠。 +
    +
    + +
    + + ▶ O(1)・O(n)・O(n²) + — Big-O蚘法 + +
    + 凊理にかかる時間・メモリが入力の倧きさ n + に察しおどう増えるかを衚す蚘法。
    + O(1)入力サむズに関わらず䞀定最速
    + O(n)入力が2倍になるず凊理も玄2倍
    + O(n²)入力が2倍になるず凊理は玄4倍二重ルヌプに倚い +
    +
    + +
    + + ▶ enumerate() + +
    + リストを回しながら「䜕番目かむンデックス」ず「倀」を同時に取り出す + Python の組み蟌み関数。C 実装のため高速です。for i, val in enumerate(nums): + のように䜿いたす。 +
    +
    + +
    + + ▶ 型ヒントType + Hints + +
    + 関数の匕数・戻り倀に型を泚釈する仕組み。def f(x: int) -> str: + のように曞きたす。pylanceVSCode + の型チェッカヌが実行前に型の䞍䞀臎を怜出できるようになりたす。 +
    +
    + +
    + + ▶ + 補数complement + +
    + 今の数 + num + ずペアになるべき数倀。complement = target - num + で蚈算したす。䟋target=9, num=2 のずき補数=7。 +
    +
    + +
    + + ▶ + ハッシュテヌブルHash Table + +
    + キヌを特殊な数倀ハッシュ倀に倉換し、倀の栌玍堎所を䞀瞬O(1)で特定できるデヌタ構造。図曞通の玢匕カヌドに䟋えるず、タむトルキヌから棚番号倀を即座に匕けるむメヌゞです。Pythonでは + dict + がこれにあたりたす。 +
    +
    + +
    + + ▶ CPython + +
    + 最も広く䜿われるPythonの実装。C蚀語で曞かれおおり、dict・enumerate() + などの組み蟌み関数の倚くがC実装のため高速です。本解説が察象ずする環境です。 +
    +
    + +
    + + ▶ 走査scan + +
    + リストや配列を先頭から末尟たで順番に芋おいくこず。「1パス走査」ずは、リストを1床だけ端から端たで芋るこずを意味したす。 +
    +
    +
    +
    + + +
    + LeetCode #1 Two Sum — Python (CPython 3.11+) 解説 | 初孊者向け完党ガむド +
    +
    + + + + + + + diff --git a/public/index.html b/public/index.html index 51546df..48d4336 100644 --- a/public/index.html +++ b/public/index.html @@ -512,8 +512,8 @@

  • 🧩Search in Rotated Sorted Array II - Technical AnalysisAlgorithm/BinarySearch/leetcode/81. Search in Rotated Sorted Array II/Claude/README.html
  • 🧩Set Matrix Zeroes Algorithm - Python ImplementationAlgorithm/Other/leetcode/73. Set Matrix Zeroes/Claude/README.html
  • 🧩Sort Colors Algorithm - Interactive Technical GuideAlgorithm/Dutch National Flag/leetcode/75. Sort Colors/Claude/README.html
  • -
  • 🧩Spiral Matrix Algorithm AnalysisAlgorithm/Other/leetcode/54. Spiral Matrix/Claude/README.html
  • 🧩Spiral Matrix Algorithm AnalysisAlgorithm/Other/leetcode/59. Spiral Matrix II/Claude/README.html
  • +
  • 🧩Spiral Matrix Algorithm AnalysisAlgorithm/Other/leetcode/54. Spiral Matrix/Claude/README.html
  • 🧩Subsets II - 反埩的拡匵法による重耇排陀 | アルゎリズム解説Algorithm/Other/leetcode/90. Subsets II/Claude/README.html
  • 🧩Two-Pointer Algorithm: Remove Duplicates from Sorted Array IIAlgorithm/TwoPointers/leetcode/80. Remove Duplicates from Sorted Array II/Claude/README.html
  • 🧩TypeScript Binary Search Performance AnalysisAlgorithm/BinarySearch/leetcode/34. Find First and Last Position of Element in Sorted Array/READEME-typescript.html
  • @@ -564,6 +564,7 @@

  • 🏗Largest Rectangle in Histogram - 単調スタックアルゎリズム解説Tailwind CDN リファクタDataStructures/Stacks/leetcode/84. Largest Rectangle in Histogram/Claude/README_tailwind.html
  • 🏗Largest Rectangle in Histogram — 技術解説単調増加スタック法 / Python, Tailwind版DataStructures/Stacks/leetcode/84. Largest Rectangle in Histogram/GPT/README_tailwind.html
  • 🏗Largest Rectangle in Histogram — 技術解説単調増加スタック法 / PythonDataStructures/Stacks/leetcode/84. Largest Rectangle in Histogram/GPT/README.html
  • +
  • 🏗LeetCode #1 Two Sum — ハッシュマップ O(n) 解説DataStructures/Map/leetcode/claude sonnet 4.6 adaptive/README_react.html
  • 🏗LeetCode #101 Symmetric Tree — 完党解説DataStructures/Trees/Other/101. Symmetric Tree/claude sonnet 4.6 extended/README_react.html
  • 🏗LeetCode 87: Scramble String - Top-down Memoized DFSDataStructures/Trees/BFS・DFS/leetcode/87. Scramble String/Claude/README.html
  • 🏗LeetCode 87: Scramble String — Top-down recursion with memoization & pruningDataStructures/Trees/BFS・DFS/leetcode/87. Scramble String/GPT/README.html
  • @@ -577,7 +578,6 @@

  • 🏗Phone Number Letter Combinations - Backtracking AlgorithmDataStructures/Trees/BFS・DFS/leetcode/17. Letter Combinations of a Phone Number/Claude/README.html
  • 🏗Rotate Right List Algorithm - Technical AnalysisDataStructures/LinkedLists/leetcode/61. Rotate List/Claude/README.html
  • 🏗Subsets Algorithm - バックトラッキング解説DataStructures/Trees/BFS・DFS/leetcode/78. Subsets/Claude/README.html
  • -
  • 🏗Two Sum - ハッシュテヌブル1パス探玢DataStructures/Map/leetcode/claude/README_react.html
  • 🏗Unix Path Simplifier - Technical AnalysisDataStructures/Stacks/leetcode/71. Simplify Path/Claude/README.html
  • 🏗Word Search Algorithm - DFS + BacktrackingDataStructures/Trees/BFS・DFS/leetcode/79. Word Search/Claude/README.html
  • 🏗カッコ列察応問題の詳现解析DataStructures/Stacks/atcoder/B51/README.html
  • @@ -697,8 +697,8 @@

  • 🧩Search in Rotated Sorted Array II - Technical AnalysisAlgorithm/BinarySearch/leetcode/81. Search in Rotated Sorted Array II/Claude/README.html
  • 🧩Set Matrix Zeroes Algorithm - Python ImplementationAlgorithm/Other/leetcode/73. Set Matrix Zeroes/Claude/README.html
  • 🧩Sort Colors Algorithm - Interactive Technical GuideAlgorithm/Dutch National Flag/leetcode/75. Sort Colors/Claude/README.html
  • -
  • 🧩Spiral Matrix Algorithm AnalysisAlgorithm/Other/leetcode/54. Spiral Matrix/Claude/README.html
  • 🧩Spiral Matrix Algorithm AnalysisAlgorithm/Other/leetcode/59. Spiral Matrix II/Claude/README.html
  • +
  • 🧩Spiral Matrix Algorithm AnalysisAlgorithm/Other/leetcode/54. Spiral Matrix/Claude/README.html
  • 🧩Subsets II - 反埩的拡匵法による重耇排陀 | アルゎリズム解説Algorithm/Other/leetcode/90. Subsets II/Claude/README.html
  • 🧩Two-Pointer Algorithm: Remove Duplicates from Sorted Array IIAlgorithm/TwoPointers/leetcode/80. Remove Duplicates from Sorted Array II/Claude/README.html
  • 🧩TypeScript Binary Search Performance AnalysisAlgorithm/BinarySearch/leetcode/34. Find First and Last Position of Element in Sorted Array/READEME-typescript.html
  • @@ -759,6 +759,7 @@

  • 🏗Largest Rectangle in Histogram - 単調スタックアルゎリズム解説Tailwind CDN リファクタDataStructures/Stacks/leetcode/84. Largest Rectangle in Histogram/Claude/README_tailwind.html
  • 🏗Largest Rectangle in Histogram — 技術解説単調増加スタック法 / Python, Tailwind版DataStructures/Stacks/leetcode/84. Largest Rectangle in Histogram/GPT/README_tailwind.html
  • 🏗Largest Rectangle in Histogram — 技術解説単調増加スタック法 / PythonDataStructures/Stacks/leetcode/84. Largest Rectangle in Histogram/GPT/README.html
  • +
  • 🏗LeetCode #1 Two Sum — ハッシュマップ O(n) 解説DataStructures/Map/leetcode/claude sonnet 4.6 adaptive/README_react.html
  • 🏗LeetCode #101 Symmetric Tree — 完党解説DataStructures/Trees/Other/101. Symmetric Tree/claude sonnet 4.6 extended/README_react.html
  • 🏗LeetCode 87: Scramble String - Top-down Memoized DFSDataStructures/Trees/BFS・DFS/leetcode/87. Scramble String/Claude/README.html
  • 🏗LeetCode 87: Scramble String — Top-down recursion with memoization & pruningDataStructures/Trees/BFS・DFS/leetcode/87. Scramble String/GPT/README.html
  • @@ -772,7 +773,6 @@

  • 🏗Phone Number Letter Combinations - Backtracking AlgorithmDataStructures/Trees/BFS・DFS/leetcode/17. Letter Combinations of a Phone Number/Claude/README.html
  • 🏗Rotate Right List Algorithm - Technical AnalysisDataStructures/LinkedLists/leetcode/61. Rotate List/Claude/README.html
  • 🏗Subsets Algorithm - バックトラッキング解説DataStructures/Trees/BFS・DFS/leetcode/78. Subsets/Claude/README.html
  • -
  • 🏗Two Sum - ハッシュテヌブル1パス探玢DataStructures/Map/leetcode/claude/README_react.html
  • 🏗Unix Path Simplifier - Technical AnalysisDataStructures/Stacks/leetcode/71. Simplify Path/Claude/README.html
  • 🏗Word Search Algorithm - DFS + BacktrackingDataStructures/Trees/BFS・DFS/leetcode/79. Word Search/Claude/README.html
  • 🏗カッコ列察応問題の詳现解析DataStructures/Stacks/atcoder/B51/README.html
  • @@ -841,7 +841,7 @@

    🧪 - Generated on 2026-05-13 + Generated on 2026-05-14