57. Insert Interval
57. Insert Interval
题目
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 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].
解析
- 此题可以借鉴56的解题思路
- 另外由于本题说明
Given a set of non-overlapping intervals
初始没有重叠元素,只是需要更改加入的区间即可,见参考代码
class Solution_57 {
public:
static int compare(Interval val1, Interval val2)
{
return val1.start < val2.start;
}
vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
vector<Interval> vec;
if (intervals.empty())
{
vec.push_back(newInterval);
return vec;
}
intervals.push_back(newInterval);
sort(intervals.begin(), intervals.end(), compare);
Interval node = intervals[0]; //
for (int i = 1; i < intervals.size();i++)
{
Interval temp = intervals[i];
if (node.end>=temp.start)
{
node.end = max(node.end,temp.end);
}
else
{
vec.push_back(node);
node = temp;
}
}
vec.push_back(node);
return vec;
}
};
vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
vector<Interval> ret;
auto it = intervals.begin();
for(; it!=intervals.end(); ++it){
if(newInterval.end < (*it).start) //all intervals after will not overlap with the newInterval
break;
else if(newInterval.start > (*it).end) //*it will not overlap with the newInterval
ret.push_back(*it);
else{ //update newInterval bacause *it overlap with the newInterval
newInterval.start = min(newInterval.start, (*it).start);
newInterval.end = max(newInterval.end, (*it).end);
}
}
// don't forget the rest of the intervals and the newInterval
ret.push_back(newInterval);
for(; it!=intervals.end(); ++it)
ret.push_back(*it);
return ret;
}
题目来源
C/C++基本语法学习
STL
C++ primer