给出一个无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
示例 1:
输入:intervals = [[1,3],[6,9]], newInterval = [2,5]
输出:[[1,5],[6,9]]
示例 2:
输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出:[[1,2],[3,10],[12,16]]
解释:这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/insert-interval
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
基本思路:可以讲序列分为三段,第一段,和新插入区间没有重叠部分,第二段有重叠部分,三部分也是没有重叠部分。具体是根据新插入区间的左端点,找到要插入序列的左边界,根据新插入区间的右端点,找到新插入序列的有边界。在左边界前和右边界后边的都是没有重合的。
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
vector<vector<int>> ans;
int a=newInterval[0];
int b=newInterval[1];
int i=0,j=0;
while(i<intervals.size()&&a>intervals[i][1]){
ans.push_back(intervals[i]);
i++;
}
j=i;
while(j<intervals.size()&&b>=intervals[j][0]){
j++;
}
if(i==j){
ans.push_back(newInterval);
}
else{
int newl=min(a,intervals[i][0]);
int newr=max(b,intervals[j-1][1]);
ans.push_back({newl,newr});
//cout<<newl<<" "<<newr<<endl;
}
while(j<intervals.size()){
ans.push_back(intervals[j]);
j++;
}
return ans;
}