Leetcode 56. Merge Intervals

Poby’s Home
2 min readMar 13, 2021

Medium — Apple interview question

Given an array of intervals where intervals[i] = [starti, endi], merge all overlapping intervals, and return an array of the non-overlapping intervals that cover all the intervals in the input.

Example 1:

Input: intervals = [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].
Example 2:

Input: intervals = [[1,4],[4,5]]
Output: [[1,5]]
Explanation: Intervals [1,4] and [4,5] are considered overlapping.

Best Algorithm

class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end());

vector<vector<int>> merged;
for (auto& interval: intervals) {
if (merged.empty() || merged.back()[1] < interval[0]) {
merged.push_back(interval);
} else {
merged.back()[1] = max(merged.back()[1], interval[1]);
}
}
return merged;
}
};

My algorithm

Two iterator

  • one iterator for output vector
  • the other iterator for input vector

I tried with only a single vector, which is the input vector, and tried to replace intervals in place. But this method will cause vector copy and it slows things down. So, to avoid vector element copy, I am using a separate output vector.

--

--