您的位置:首页 > 其它

Leetcode 56. Merge Intervals && 57. Insert Interval(Hard)

2016-10-12 17:11 369 查看

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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: