Insert Interval
Solution 1
因为题面上给的条件已经非常明确了,不重叠且排好序,所以直接线性遍历找到合适的位置即可,只是这个时候合并区间只与输入有关,需要考虑输入包含多个区间的情况。
- 如果当前考察区间的右边界小于输入左边界,插入之
- 如果当前考察区间的左边界大于输入有边界,如果是第一个,先插入输入,再插入之;否则直接插入之
- 不满足上述两种情况,则二者必然存在重叠,将二者合并(注意同时考虑左右边界),向后继续遍历(可能还可以继续合并,在第二种情形考虑插入)
- 时间复杂度: O ( N ) O(N) O(N),其中 N N N为输入的区间个数,线性遍历
- 空间复杂度: O ( 1 ) O(1) O(1),不考虑输出占用,仅维护常数个状态变量
class Solution {
public:
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
vector<vector<int>> ans;
bool flag = false;
for (const auto& interval: intervals) {
if (interval[1] < newInterval[0]) {
ans.push_back(interval);
}
else if (interval[0] > newInterval[1]) {
if (!flag) {
ans.push_back(newInterval);
flag = true;
}
ans.push_back(interval);
}
else {
// 有交集,吸收掉
newInterval[0] = min(newInterval[0], interval[0]);
newInterval[1] = max(newInterval[1], interval[1]);
}
}
if (!flag) {
ans.push_back(newInterval);
}
return ans;
}
};
Solution 2
Solution 1的Python实现
class Solution:
def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
ans = list()
flag = False
for interval in intervals:
if interval[1] < newInterval[0]: ans.append(interval)
elif interval[0] > newInterval[1]:
if not flag:
ans.append(newInterval)
flag = True
ans.append(interval)
else:
newInterval[0] = min(newInterval[0], interval[0])
newInterval[1] = max(newInterval[1], interval[1])
if not flag: ans.append(newInterval)
return ans