题目难度:middle
题目描述:
给你一个 无重叠的 ,按照区间起始端点排序的区间列表
intervals
,其中intervals[i] = [starti, endi]
表示第i
个区间的开始和结束,并且intervals
按照starti
升序排列。同样给定一个区间newInterval = [start, end]
表示另一个区间的开始和结束。在
intervals
中插入区间newInterval
,使得intervals
依然按照starti
升序排列,且区间之间不重叠(如果有必要的话,可以合并区间)。返回插入之后的
intervals
。注意 你不需要原地修改
intervals
。你可以创建一个新数组然后返回它。示例 1:
输入: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]
重叠。提示:
intervals
根据starti
按 升序 排列
解题思路:
本题考察的是数组合并以及数组排序,首先我们需要确定的是,根据题目的意思,我们需要把插入newInterval后重叠的数组部分进行合并,很多同学在这一步会卡着,不知道怎么处理重叠合并这一要求,实际上是把题目想的过于复杂,在插入时既考虑 intervals[i],又考虑
intervals[i+1]与newInterval的重叠,实际上,我们不需要考虑那么麻烦,只需要定义一个vector容器tmp,初始值赋值为Interval即可,再依次遍历
intervals的每一个元素,判断tmp是否和它们重合,若重合则使用tmp进行合并 若不重合则将当前遍历的元素插入我们创建的返回数组res中即可,在遍历完成之后需要将tmp插入到res中,然后对res进行升序排序,最后返回res即可
代码实现如下:
class Solution {
public:
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
vector<vector<int>> res;
vector<int> tmp = newInterval;
int size = intervals.size();
for(int i=0;i<size;i++){
if(tmp[1]<intervals[i][0]||tmp[0]>intervals[i][1]) res.push_back(intervals[i]);
else{
tmp[0] = min(tmp[0],intervals[i][0]);
tmp[1] = max(tmp[1],intervals[i][1]);
}
}
res.push_back(tmp);
sort(res.begin(),res.end());
return res;
}
};
提交表现: