LeetCode-笔记-57.插入区间
1、题目
给你一个 无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
示例 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] 重叠。
示例 3:
输入:intervals = [], newInterval = [5,7]
输出:[[5,7]]
示例 4:
输入:intervals = [[1,5]], newInterval = [2,3]
输出:[[1,5]]
示例 5:
输入:intervals = [[1,5]], newInterval = [2,7]
输出:[[1,7]]
提示:
0 <= intervals.length <= 104
intervals[i].length == 2
0 <= intervals[i][0] <= intervals[i][1] <= 105
intervals 根据 intervals[i][0] 按 升序 排列
newInterval.length == 2
0 <= newInterval[0] <= newInterval[1] <= 105
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/insert-interval
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2、分析题目
最开始的想法是二分查找,这样可以快速找到newInteral[0]与newInteral[1]在区间数组intervals中的位置,但经过实践发现这样实现比较繁琐,最终采用了模拟法。具体可以观察下图:
1、图中红色区域为intervals的区间 2、图中蓝色区域为newInteral插入的区间。3、建立新区间集合ans
设newInteral左端为left,右端为right。观察图像得合并后区间左端为left=min(left,intervals[i] [0]),右端为right=min(right,intervals[i] [1])。
遍历区间,当left>intervals[i] [1],ans尾部直接添加intervals,当right<intervals[i] [0],ans尾部直接添加一次{left,right},再添加intervals,都不满足则合并区间,遍历完成后如果{left,right}未添加,还需将其添加至尾部。
3、代码如下
class Solution {
public:
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
int left = newInterval[0];
int right = newInterval[1];
int length = intervals.size();
bool placed = false;
vector<vector<int>> ans;
for(int i=0;i<length;++i){
if(intervals[i][0]>right){
if(!placed){
placed=true;
ans.push_back({left,right});
}
ans.push_back(intervals[i]);
}else if(intervals[i][1]<left){
ans.push_back(intervals[i]);
}else{
left=min(left,intervals[i][0]);
right=max(right,intervals[i][1]);
}
}
if(!placed){
ans.push_back({left,right});
}
return ans;
}
};