56. Merge Intervals
Description:
Given a collection of intervals, merge all overlapping intervals.
Difficulty:Medium
Example:
Input: [[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].
Input: [[1,4],[4,5]]
Output: [[1,5]]
Explanation: Intervals [1,4] and [4,5] are considered overlapping.
方法1:Sort
- Time complexity : O ( n l o g n ) O\left ( nlogn \right ) O(nlogn)
- Space complexity :
O
(
1
)
O\left ( 1 \right )
O(1)
思路:
先按照区间的start进行排序,再根据res.back().end
和intervals[i].start
的大小进行push_back()
或者改变res.back().end
的大小。
class Solution {
public:
vector<Interval> merge(vector<Interval>& intervals) {
if (intervals.empty()) return vector<Interval>{};
sort(intervals.begin(), intervals.end(), [](Interval a, Interval b) {return a.start < b.start; });
vector<Interval> res(1, intervals[0]);
for (int i = 1; i < intervals.size(); i++) {
if (intervals[i].start > res.back().end)
res.push_back(intervals[i]);
else
res.back().end = max(res.back().end, intervals[i].end);
}
return res;
}
};
方法2:insert
- Time complexity : O ( n 2 ) O\left ( n^2 \right ) O(n2)
- Space complexity :
O
(
1
)
O\left ( 1 \right )
O(1)
思路:
可以不排序,调用第57. Insert Interval的插入方法,hard题目
class Solution {
public:
vector<Interval> merge(vector<Interval>& intervals) {
vector<Interval> res;
for (int i = 0; i < intervals.size(); ++i) {
res = insert(res, intervals[i]);
}
return res;
}
vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
vector<Interval> res;
int n = intervals.size(), cur = 0;
for (int i = 0; i < n; ++i) {
if (intervals[i].end < newInterval.start) {
res.push_back(intervals[i]);
++cur;
} else if (intervals[i].start > newInterval.end) {
res.push_back(intervals[i]);
} else {
newInterval.start = min(newInterval.start, intervals[i].start);
newInterval.end = max(newInterval.end, intervals[i].end);
}
}
res.insert(res.begin() + cur, newInterval);
return res;
}
};