給定一組區間集合,合併所有重疊的區間。
輸入:[[1,3],[2,6],[8,10],[15,18]]
輸出:[[1,6],[8,10],[15,18]]
start 升序排序(start 相同時按 end 升序)。cur,遍歷排序後的列表:if (interval.start <= cur.end) // 有重疊
cur.end = max(cur.end, interval.end); // 擴展右端點
else // 無重疊
ans.push_back(cur);
cur = interval;
cur 加入答案。vector<Interval> merge(vector<Interval>& intervals) {
if (intervals.empty()) return {};
sort(intervals.begin(), intervals.end(), [](const Interval& a, const Interval& b) {
return a.start == b.start ? a.end < b.end : a.start < b.start;
});
vector<Interval> ans;
Interval cur = intervals[0];
for (size_t i = 1; i < intervals.size(); ++i) {
if (intervals[i].start <= cur.end) {
cur.end = max(cur.end, intervals[i].end);
} else {
ans.push_back(cur);
cur = intervals[i];
}
}
ans.push_back(cur);
return ans;
}
O(n log n)(排序主導)O(1) 額外空間(不計輸出),或 O(n)(若排序使用額外空間)start 相等的情況,否則 [[1,4],[1,2]] 會合併錯誤。[[1,4],[4,5]] 應合併為 [[1,5]](端點相接視為重疊)。