56. Merge Intervals
Problem :
Given a collection of intervals, merge all overlapping intervals.
Example:
Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].
Algorithm:
本题为一个合并区间的题目,即给定一组区间,将多个存在重叠部分的区间合并为一个大区间。本题的具体思路为,首先将所有区间按照左端点从小到大的顺序重新排列。然后,对于相邻两个区间,如果前一个区间的右端点大于后一区间的左端点,则表明两个区间需要进行合并,合并后的新区间的右端点即为两者右端点中的最大值。继续向后进行上述比较,直到前一个区间的右端点小于后一区间的左端点,则表明前一区间已经不会继续向后合并,前一区间加入新区间集合中。
重复上述过程,扫描完所有区间,即可得到答案。其中,排序所需时间为O(nlogn),从头到尾遍历所有区间需要时间为O(n),总时间复杂度为O(nlogn)。
Code:
/**
* Definition for an interval.
* struct Interval {
* int start;
* int end;
* Interval() : start(0), end(0) {}
* Interval(int s, int e) : start(s), end(e) {}
* };
*/
bool cmd(Interval n1, Interval n2){
return n1.start < n2.start;
}
class Solution {
public:
vector<Interval> merge(vector<Interval>& intervals) {
if(intervals.size() == 0) return vector<Interval>();
sort(intervals.begin(), intervals.end(), cmd);
vector<Interval> ans;
int tb = intervals[0].start;
int te = intervals[0].end;
for(int i = 1; i < intervals.size(); ++i) {
if(intervals[i].start > te){
ans.push_back(Interval(tb, te));
tb = intervals[i].start;
te = intervals[i].end;
}
else if(intervals[i].end > te) te = intervals[i].end;
}
ans.push_back(Interval(tb, te));
return ans;
}
};
57. Insert Interval
Problem :
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).
You may assume that the intervals were initially sorted according to their start times.
Example:
Example 1:
Given intervals [1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].
Example 2:
Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].
This is because the new interval [4,9] overlaps with [3,5],[6,7],[8,10].
Algorithm:
本题和56题为两道母子题。本题的做法为,先将所给区间插入所给区间序列合适的位置中,然后与56题采用相同的做法即可。
其中,插入区间所需时间为O(n),从头到尾遍历所有区间需要时间为O(n),总时间复杂度为O(n)。
Code:
/**
* Definition for an interval.
* struct Interval {
* int start;
* int end;
* Interval() : start(0), end(0) {}
* Interval(int s, int e) : start(s), end(e) {}
* };
*/
bool cmd(Interval n1, Interval n2){
return n1.start < n2.start;
}
class Solution {
public:
vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
bool judge = false;
for(int i = 0; i < intervals.size(); ++i) {
if(intervals[i].start > newInterval.start) {
intervals.insert(intervals.begin() + i, newInterval);
judge = true;
break;
}
}
if(!judge) intervals.push_back(newInterval);
vector<Interval> ans;
int tb = intervals[0].start;
int te = intervals[0].end;
for(int i = 1; i < intervals.size(); ++i) {
if(intervals[i].start > te){
ans.push_back(Interval(tb, te));
tb = intervals[i].start;
te = intervals[i].end;
}
else if(intervals[i].end > te) te = intervals[i].end;
}
ans.push_back(Interval(tb, te));
return ans;
}
};