後ろからの 3 ポインタマージ — O(m+n) インプレース実装
ソート済み配列
nums1(有効要素
m
個、末尾
n
個はゼロ埋め)と
nums2(n
個)を
nums1
にインプレースでマージし、非減少順に並べる。
入力
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
出力
[1, 2, 2, 3, 5, 6]
| アプローチ | 時間計算量 | 空間計算量 | 備考 |
|---|---|---|---|
| 後ろから 3 ポインタ ✅ | O(m+n) | O(1) | 最適解。追加アロケーションなし |
| コピー後 .sort() | O((m+n) log(m+n)) | O(m+n) | 実装最短だが計算量で劣る |
| 一時バッファ使用 | O(m+n) | O(m) | 前からマージ可能だが空間を消費 |
| heapq.merge | O(m+n) | O(m+n) | 一時リスト生成あり |
k - i = n ≥ 0。 各イテレーションで k は必ず 1 減少し、i か j のどちらかも 1 減少する。 i
減少時は k - i が不変、j 減少時は k - i が 1 増加。
よって k ≥ i が常に成立し、未処理の nums1 要素を上書きしない。