Skip to content

Commit 61c21df

Browse files
committed
Refine LeetCode 88 (Python, Rust, TS): Correct space complexity for Python, clarify Rust index safety, add TS non-null assertions, and improve React UI
1 parent 3285bec commit 61c21df

6 files changed

Lines changed: 29 additions & 29 deletions

File tree

Algorithm/Sort/MergeSort/leetcode/claude 4.6 sonnet extended/88. Merge Sorted Array/Merge_Sorted_Array_Python.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ LeetCode のシグネチャは `None` 返却の破壊的操作。Pylance 対応
2121

2222
| アプローチ | 時間計算量 | 空間計算量 | Python実装コスト | 可読性 | 標準ライブラリ活用 | CPython最適化 | 備考 |
2323
| ---------------------- | ---------------- | ---------- | ---------------- | ------ | ------------------ | ------------------- | ------------------------- |
24-
| 後ろから3ポインタ | O(m+n) | O(1) || ★★★ | なし || 追加アロケーションなし ✅ |
25-
| コピー後 `list.sort()` | O((m+n)log(m+n)) | O(1) | 最低 | ★★★ | なし | 適(Timsort C実装) | 競技次善策 |
24+
| 後ろから3ポインタ | O(m+n) | O(n) || ★★★ | なし || 追加アロケーションなし ✅ |
25+
| コピー後 `list.sort()` | O((m+n)log(m+n)) | O(m+n) | 最低 | ★★★ | なし | 適(Timsort C実装) | 競技次善策 |
2626
| `heapq.merge` + 展開 | O(m+n) | O(m+n) || ★★☆ | heapq || 一時リスト生成が発生 |
2727

2828
---
@@ -48,7 +48,7 @@ class Solution:
4848
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
4949
"""
5050
2つのソート済み配列を nums1 にインプレースでマージする。
51-
後ろから走査する3ポインタ法により O(m+n) 時間・O(1) 追加空間を実現
51+
後ろから走査する3ポインタ法により O(m+n) 時間・O(n) 追加空間(スライス代入による最悪ケース)を実現
5252
5353
不変条件: k >= i が常に成立するため nums1 の未処理要素を上書きしない。
5454
初期値 k - i = n >= 0 が各イテレーションで保持される。
@@ -94,7 +94,7 @@ class Solution:
9494
ローカル変数へのキャッシュで LOAD_FAST を最大活用。
9595
9696
Time Complexity: O(m + n)
97-
Space Complexity: O(1)
97+
Space Complexity: O(n)
9898
"""
9999
# ローカル変数へのバインドで属性ルックアップを排除
100100
i, j, k = m - 1, n - 1, m + n - 1

Algorithm/Sort/MergeSort/leetcode/claude 4.6 sonnet extended/88. Merge Sorted Array/Merge_Sorted_Array_Rust.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,4 +95,4 @@ LeetCode の引数は `i32` ですが、配列インデックスは `usize` が
9595

9696
**ループ本体の最小化**
9797

98-
比較1回・代入1回・デクリメント1回のみ。イテレータ抽象化より命令型ループが適切なケースで、コンパイラは確実にインライン展開・SIMD 最適化を適用できます
98+
比較1回・代入1回・デクリメント1回のみ。イテレータ抽象化より命令型ループが適切なケースで、コンパイラは最適化レベルや実装に依存してインライン展開を適用する可能性があります

Algorithm/Sort/MergeSort/leetcode/claude 4.6 sonnet extended/88. Merge Sorted Array/Merge_Sorted_Array_TypeScript.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ function merge(nums1: number[], m: number, nums2: number[], n: number): void {
7878
// nums2 の残余要素をコピー
7979
// (nums1 の残余は既に正しい位置にあるため操作不要)
8080
while (j >= 0) {
81-
nums1[k] = nums2[j];
81+
nums1[k] = nums2[j]!;
8282
j--;
8383
k--;
8484
}

Algorithm/Sort/MergeSort/leetcode/claude 4.6 sonnet extended/88. Merge Sorted Array/README.md

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,16 @@
22

33
---
44

5-
## 目次(Table of Contents)
5+
## Overview
6+
7+
### 目次(Table of Contents)
68

79
- [Overview](#overview)
810
- [Algorithm](#algorithm)
911
- [Complexity](#complexity)
1012
- [Implementation](#implementation)
1113
- [Optimization](#optimization)
1214

13-
---
14-
15-
## Overview
16-
1715
### 問題要約
1816

1917
**LeetCode 88 – Merge Sorted Array**
@@ -153,7 +151,7 @@ k - i = (m + n - 1 - step_count) - (m - 1 - i_decrements)
153151
| ----------------------------- | ----------------- | -------- | --------------------------------------- |
154152
| 本実装(後ろから 3 ポインタ) | O(m+n) | **O(n)** | スライス代入の空間コストを含む |
155153
| 前から + 一時バッファ | O(m+n) | O(m) | `nums1[:m]``list()` でコピー |
156-
| `nums1 + nums2``.sort()` | O((m+n) log(m+n)) | O(1) | Timsort は C 実装で高速だが計算量は劣る |
154+
| `nums1 + nums2``.sort()` | O((m+n) log(m+n)) | O(m+n) | Timsort は C 実装で高速だが計算量は劣る |
157155
| `heapq.merge` + スライス代入 | O(m+n) | O(m+n) | 一時リストが発生 |
158156

159157
---
@@ -277,7 +275,7 @@ nums1[:] = merged
277275
```
278276

279277
O(m+n) だが一時リストが O(m+n) の追加空間を消費する。
280-
空間計算量の観点で本実装(O(1))に劣る。
278+
空間計算量の観点で、スライス代入 `nums1[:j+1] = nums2[:j+1]` を用いる本実装(最悪ケース O(n))に劣る。
281279

282280
**Q6. 等値要素の扱いはどうなるか?**
283281

Algorithm/Sort/MergeSort/leetcode/claude 4.6 sonnet extended/88. Merge Sorted Array/README_React.html

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ <h3 class="text-teal-800 font-bold text-lg mb-3">核心アイデア</h3>
251251
<span
252252
><strong class="text-slate-700">残余は nums2 のみ</strong
253253
>:nums1 の残余は既に正しい位置にある。nums2
254-
の残りのみスライス代入で処理</span
254+
の残りのみコピーする</span
255255
>
256256
</li>
257257
</ul>
@@ -622,7 +622,7 @@ <h3 class="text-teal-800 font-bold text-lg mb-3">核心アイデア</h3>
622622
ループバック
623623
</text>
624624

625-
<!-- 6. nums2 残余スライスコピー rect: y=492, h=60, bottom=552 -->
625+
<!-- 6. nums2 残余コピー rect: y=492, h=60, bottom=552 -->
626626
<rect
627627
x="60"
628628
y="492"
@@ -642,7 +642,7 @@ <h3 class="text-teal-800 font-bold text-lg mb-3">核心アイデア</h3>
642642
font-weight="bold"
643643
fill="#1e293b"
644644
>
645-
nums2 残余スライスコピー
645+
nums2 残余コピー
646646
</text>
647647
<text
648648
x="280"
@@ -700,8 +700,7 @@ <h3 class="text-teal-800 font-bold text-lg mb-3">核心アイデア</h3>
700700
3. <strong>比較・書き込み</strong>:nums1[i] と nums2[j] を比較し大きい方を
701701
nums1[k] に書き込み、対応するポインタを減算<br />
702702
4. <strong>k-- 後に紫破線でループ条件へ戻る</strong>(不変条件 k ≥ i を維持)<br />
703-
5. <strong>残余コピー</strong>:nums2 が残っていれば CPython の memmove
704-
相当のスライス代入で高速一括コピー
703+
5. <strong>残余コピー</strong>:nums2 が残っていれば残りの要素をコピーする
705704
</div>
706705
</section>
707706

@@ -1316,9 +1315,11 @@ <h3 className="mt-0 text-teal-800 text-lg font-bold mb-2">
13161315
j -= 1
13171316
k -= 1
13181317
1319-
# nums2 残余: CPython の memmove 相当でスライス一括コピー
1320-
if j >= 0:
1321-
nums1[: j + 1] = nums2[: j + 1]`,
1318+
# nums2 残余コピー
1319+
while j >= 0:
1320+
nums1[k] = nums2[j]
1321+
j -= 1
1322+
k -= 1`,
13221323

13231324
typescript: `function merge(
13241325
nums1: number[], m: number,

public/Algorithm/Sort/MergeSort/leetcode/claude 4.6 sonnet extended/88. Merge Sorted Array/README_React.html

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ <h3 class="text-teal-800 font-bold text-lg mb-3">核心アイデア</h3>
251251
<span
252252
><strong class="text-slate-700">残余は nums2 のみ</strong
253253
>:nums1 の残余は既に正しい位置にある。nums2
254-
の残りのみスライス代入で処理</span
254+
の残りのみコピーする</span
255255
>
256256
</li>
257257
</ul>
@@ -622,7 +622,7 @@ <h3 class="text-teal-800 font-bold text-lg mb-3">核心アイデア</h3>
622622
ループバック
623623
</text>
624624

625-
<!-- 6. nums2 残余スライスコピー rect: y=492, h=60, bottom=552 -->
625+
<!-- 6. nums2 残余コピー rect: y=492, h=60, bottom=552 -->
626626
<rect
627627
x="60"
628628
y="492"
@@ -642,7 +642,7 @@ <h3 class="text-teal-800 font-bold text-lg mb-3">核心アイデア</h3>
642642
font-weight="bold"
643643
fill="#1e293b"
644644
>
645-
nums2 残余スライスコピー
645+
nums2 残余コピー
646646
</text>
647647
<text
648648
x="280"
@@ -700,8 +700,7 @@ <h3 class="text-teal-800 font-bold text-lg mb-3">核心アイデア</h3>
700700
3. <strong>比較・書き込み</strong>:nums1[i] と nums2[j] を比較し大きい方を
701701
nums1[k] に書き込み、対応するポインタを減算<br />
702702
4. <strong>k-- 後に紫破線でループ条件へ戻る</strong>(不変条件 k ≥ i を維持)<br />
703-
5. <strong>残余コピー</strong>:nums2 が残っていれば CPython の memmove
704-
相当のスライス代入で高速一括コピー
703+
5. <strong>残余コピー</strong>:nums2 が残っていれば残りの要素をコピーする
705704
</div>
706705
</section>
707706

@@ -1316,9 +1315,11 @@ <h3 className="mt-0 text-teal-800 text-lg font-bold mb-2">
13161315
j -= 1
13171316
k -= 1
13181317
1319-
# nums2 残余: CPython の memmove 相当でスライス一括コピー
1320-
if j >= 0:
1321-
nums1[: j + 1] = nums2[: j + 1]`,
1318+
# nums2 残余コピー
1319+
while j >= 0:
1320+
nums1[k] = nums2[j]
1321+
j -= 1
1322+
k -= 1`,
13221323

13231324
typescript: `function merge(
13241325
nums1: number[], m: number,

0 commit comments

Comments
 (0)