插入区间
题目链接: https://leetcode.cn/problems/insert-interval/
# LeetCode 57.插入区间
# 题目描述
给你一个 无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
举个例子:
输入:intervals = [[1,3],[6,9]], newInterval = [2,5]
输出:[[1,5],[6,9]]
# 思路解析
循环遍历数组intervals
,对于newInterval
和intervals[i]
我们分三种情况来讨论:
newInterval
在intervals[i]
的左边,此时把newInterval
和intervals
区间[i,n)
的元素依次压入res
中,并返回res
, 其中n
为intervals
的大小,res
为存储结果的数组。
newInterval
在intervals[i]
的右边,此时把intervals[i]
压入res
中,newInterval
继续跟intervals[i]
后面的元素比较,++i
。
newInterval
和intervals[i]
有重叠,更新newInterval
。newInterval[0] = min(newInterval[0], intervals[i][0])
,newInterval[1] = max(newInterval[1], intervals[i][1])
,更新后的newInterval
继续和intervals[i]
后面的元素比较,++i
。
# C++代码
class Solution {
public:
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
vector<vector<int>> res;
int intervals_len = intervals.size();
for (int i = 0; i < intervals_len; ++i) {
//newInterval在intervals[i]的左边
if (newInterval[1] < intervals[i][0]) {
//res中保存newInterval
res.push_back(newInterval);
for (int j = i; j < intervals_len; ++j) {
res.push_back(intervals[j]);
}
return res;
//newInterval在intervals[i]的右边
} else if (newInterval[0] > intervals[i][1]) {
//res中保存intervals[i]
res.push_back(intervals[i]);
//newInterval和intervals[i]重叠
} else {
//更新newInterval
newInterval[0] = min(newInterval[0], intervals[i][0]);
newInterval[1] = max(newInterval[1], intervals[i][1]);
}
}
res.push_back(newInterval);
return res;
}
};
# 复杂度分析
时间复杂度: 需要遍历一遍数组intervals
,所以时间复杂度为O(n),其中n
为数组的长度。
空间复杂度: 需要用到res
来保存结果,所以空间复杂度为O(n),其中n
为数组的长度。
上次更新: 2024/07/08, 20:31:33