题目:
给出一个无重叠的按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
样例
插入区间[2, 5] 到 [[1,2], [5,9]],我们得到 [[1,9]]。
插入区间[3, 4] 到 [[1,2], [5,9]],我们得到 [[1,2], [3,4], [5,9]]。
解:
分三种情况:
第一个if:插入的end比原区间的第i个元素的start小(即自己最大的比人家最小的还要小,就放到人家前面),例: 插入区间[2,5]到[[6,7]] 当前 i 是指向[6,7],因为5比6要小,即将[2,5]插入到[6,7]前---》[[2,5],[6,7]]
第二个if:插入的start比原区间的第i个元素的end大(自己最小的也比人家最大的大,放在人家后面),例:插入区间[2,5]到[[0,1]] 当前i 指向[0,1],2比1大,即将[2,5]插入到[0,1]后--》[[0,1],[2,5]]
第三个if:其他情况,取最大的区间范围,最小的start为插入区间的start,最大的end为插入区间的end,便可符合以上两个if其中一种。
/** * Definition of Interval: * class Interval { * public: * 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) { // write your code here vector<Interval> res; if(intervals.size()==0){ res.push_back(newInterval); return res; } int sz=intervals.size(); for(int i=0;i<sz;i++) { Interval in=intervals[i]; if(newInterval.end<in.start) { res.push_back(newInterval); res.insert(res.end(),intervals.begin()+i,intervals.end()); return res; } else if(in.end<newInterval.start) { res.push_back(in); } else { newInterval.start = min(newInterval.start, in.start); newInterval.end = max(newInterval.end, in.end); } } res.push_back(newInterval); return res; } };