给你一个 无重叠的 ,按照区间起始端点排序的区间列表 intervals,其中 intervals[i] = [starti, endi] 表示第 i 个区间的开始和结束,并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval = [start, end] 表示另一个区间的开始和结束。
在 intervals 中插入区间 newInterval,使得 intervals 依然按照 starti 升序排列,且区间之间不重叠(如果有必要的话,可以合并区间)。
返回插入之后的 intervals。
注意 你不需要原地修改 intervals。你可以创建一个新数组然后返回它。
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> insertInterval(vector<vector<int>>& intervals, vector<int>& newInterval) {
vector<vector<int>> result;
int n = intervals.size();
int i = 0;
// 将所有起始时间比新区间结束时间早的区间加入结果数组
while (i < n && intervals[i][1] < newInterval[0]) {
result.push_back(intervals[i]);
i++;
}
// 合并重叠区间
while (i < n && intervals[i][0] <= newInterval[1]) {
newInterval[0] = min(newInterval[0], intervals[i][0]);
newInterval[1] = max(newInterval[1], intervals[i][1]);
i++;
}
result.push_back(newInterval);
// 将剩余的区间加入结果数组
while (i < n) {
result.push_back(intervals[i]);
i++;
}
return result;
}
int main() {
vector<vector<int>> intervals = {{1, 3}, {6, 9}};
vector<int> newInterval = {2, 5};
vector<vector<int>> result = insertInterval(intervals, newInterval);
cout << "output after inserting new interval: ";
for (auto interval : result) {
cout << "[" << interval[0] << ", " << interval[1] << "] ";
}
cout << endl;
return 0;
}
复杂度分析,记区间列表的长度为n。
时间复杂度:
遍历原区间列表找到需要插入新区间的位置需要O(n)的时间复杂度。
合并重叠区间也需要O(n)的时间复杂度。
最终构建出插入后的新区间列表需要O(n)的时间复杂度。
因此,总体时间复杂度为O(n)。
空间复杂度:
我们使用了一个额外的结果数组来存储插入后的新区间列表,其空间复杂度为O(n)(最坏情况下)。
除此之外,我们只使用了几个额外的变量来辅助操作,因此除结果数组外的空间复杂度可以忽略不计。
综合考虑,总体空间复杂度为O(n)。
因此,该算法的时间复杂度为O(n),空间复杂度也为O(n)。