Description
Given a non-overlapping interval list which is sorted by start point.
Insert a new interval into it, make sure the list is still in order and non-overlapping (merge intervals if necessary).
Have you met this question in a real interview?
Example
Insert (2, 5) into [(1,2), (5,9)], we get [(1,9)].
Insert (3, 4) into [(1,2), (5,9)], we get [(1,2), (3,4), (5,9)].
解法:
分3种情况分别处理。
/**
* Definition of Interval:
* classs Interval {
* int start, end;
* Interval(int start, int end) {
* this->start = start;
* this->end = end;
* }
*
* }
*/
class Solution {
public:
/**
* @param intervals: Sorted interval list.
* @param newInterval: new interval.
* @return: A new interval list.
*/
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;
}
};
解法2:这个解法可能还好点,因为最后不用在vector中间插入。
注意:需要插入newInterval的情况只有两种。
- interval.start > newInterval.end,这个时候newInterval已经处理完所有的overlap,需要插入在interval的前面。
- 全部处理完了,newInterval放在最后。
class Solution {
public:
/**
* @param intervals: Sorted interval list.
* @param newInterval: new interval.
* @return: A new interval list.
*/
vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {
vector<Interval> res;
bool inSerted = false;
for (auto interval : intervals) {
if (interval.start > newInterval.end) {
if (!inSerted) {
res.push_back(newInterval);
inSerted = true;
}
res.push_back(interval);
} else if (interval.end < newInterval.start) {
res.push_back(interval);
} else {
newInterval.start = min(interval.start, newInterval.start);
newInterval.end = max(interval.end, newInterval.end);
}
}
if (!inSerted) {
res.push_back(newInterval);
}
return res;
}
};
解法3:跟解法2差不多,更简单。
把结果的result分成left和right两部分。
left处理完后把newInterval push_back到left,
没有冲突的都放到right。
最后left和right再合并起来。
下次再做。
1428

被折叠的 条评论
为什么被折叠?



