Skip to content
ajdevhub
1 min read

πŸ“ Intervals

Interval problems involve ranges [start, end]. The key insight: sort by start time, then handle overlaps greedily. Most problems reduce to merge, insert, or count operations.


Core Patterns

PatternApproachExample
Merge overlappingSort by start, merge when curr.start ≀ prev.endMerge Intervals
Insert & mergeFind position, expand new interval to cover overlapsInsert Interval
Count non-overlappingSort by end, greedily keep non-overlappingActivity selection
Interval intersectionTwo-pointer on sorted lists, advance smaller endInterval List Intersections
Min interval for queriesSort both, use min-heap keyed by interval sizeQuery coverage

Templates

// Merge Intervals β€” sort by start, then merge
sort(intervals.begin(), intervals.end());
vector<vector<int>> res;
for (auto& iv : intervals) {
    if (res.empty() || iv[0] > res.back()[1])
        res.push_back(iv);
    else
        res.back()[1] = max(res.back()[1], iv[1]);
}

// Insert Interval β€” three-phase scan
vector<vector<int>> res;
int i = 0, n = intervals.size();
// Phase 1: intervals entirely before newInterval
while (i < n && intervals[i][1] < newInterval[0])
    res.push_back(intervals[i++]);
// Phase 2: merge overlapping
while (i < n && intervals[i][0] <= newInterval[1]) {
    newInterval[0] = min(newInterval[0], intervals[i][0]);
    newInterval[1] = max(newInterval[1], intervals[i][1]);
    i++;
}
res.push_back(newInterval);
// Phase 3: intervals entirely after
while (i < n) res.push_back(intervals[i++]);

Overlap Condition

Two intervals [a, b] and [c, d] overlap iff a ≀ d && c ≀ b. They do not overlap iff b < c (first ends before second starts) or d < a.

Complexity

PatternTimeSpace
Merge / InsertO(n log n)O(n)
Intersection (two sorted lists)O(m + n)O(m + n)