🔧 Insert Interval Algorithm Analysis

TypeScriptを用いた効率的な区間挿入アルゴリズムの詳細解析

TypeScript実装コード

TypeScript Implementation
/** * Insert a new interval into a sorted array of non-overlapping intervals * @param intervals - Array of non-overlapping intervals sorted by start time * @param newInterval - New interval to insert [start, end] * @returns New array of intervals after insertion and merging */ function insert(intervals: number[][], newInterval: number[]): number[][] { const result: number[][] = []; let i = 0; const n = intervals.length; // Step 1: Add all intervals that end before newInterval starts while (i < n && intervals[i][1] < newInterval[0]) { result.push(intervals[i]); i++; } // Step 2: Merge all overlapping intervals with newInterval let mergedStart = newInterval[0]; let mergedEnd = newInterval[1]; while (i < n && intervals[i][0] <= newInterval[1]) { mergedStart = Math.min(mergedStart, intervals[i][0]); mergedEnd = Math.max(mergedEnd, intervals[i][1]); i++; } // Add the merged interval result.push([mergedStart, mergedEnd]); // Step 3: Add all remaining intervals that start after newInterval ends while (i < n) { result.push(intervals[i]); i++; } return result; }

アルゴリズムフロー

Step 1

新区間開始前に終了する区間を追加

Step 2

重複区間をマージ

Step 3

新区間終了後に開始する区間を追加

視覚的デモンストレーション

Example 1: intervals = [[1,3],[6,9]], newInterval = [2,5]

Example 2: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]

各ステップの詳細解析

Step 1: 前処理 (Non-overlapping前区間の追加)

条件: intervals[i][1] < newInterval[0]

処理: 新区間と重複しない前の区間をそのまま結果に追加

Step 2: マージ処理 (重複区間の統合)

条件: intervals[i][0] <= newInterval[1]

処理: 重複する全ての区間を新区間と統合

Step 3: 後処理 (残り区間の追加)

条件: i < n (残りの区間が存在)

処理: 新区間と重複しない後の区間をそのまま結果に追加

計算量解析

項目 計算量 説明
時間計算量 O(n) 配列を一度だけ線形走査
空間計算量 O(1) 結果配列以外の追加領域は定数
最悪ケース O(n) 全区間が重複する場合でも線形時間
最良ケース O(n) 重複なしでも全配列走査が必要

最適化のポイント

1. 単一パス処理

配列を一度だけ走査することで、効率的な処理を実現

2. 3段階分割

処理を明確に3段階に分けることで、複雑な条件判定を回避

3. Math.min/maxの活用

条件分岐を最小化し、コードの可読性と効率性を向上

4. TypeScript型安全性

コンパイル時の型チェックによる実行時エラーの防止