57. Insert Interval
题目大意
You are given an array of non-overlapping intervals intervals
where intervals[i] = [starti, endi]
represent the start and the end of the ith interval and intervals
is sorted in ascending order by starti
. You are also given an interval newInterval = [start, end]
that represents the start and end of another interval.
Insert newInterval
into intervals
such that intervals
is still sorted in ascending order by starti
and intervals
still does not have any overlapping intervals (merge overlapping intervals if necessary).
Return intervals
after the insertion.
中文释义
给你一个由非重叠的区间组成的数组 intervals
,其中 intervals[i] = [starti, endi]
表示第 i 个区间的开始和结束,且 intervals
按照 starti
升序排序。你还会得到另一个区间 newInterval = [start, end]
。
将 newInterval
插入到 intervals
中,使得 intervals
仍然按 starti
升序排序,并且 intervals
中没有重叠的区间(如果必要,合并重叠的区间)。
返回插入后的 intervals
。
示例
Example 1:
Input: intervals = [[1,3],[6,9]]
, newInterval = [2,5]
Output: [[1,5],[6,9]]
Example 2:
Input: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]]
, newInterval = [4,8]
Output: [[1,2],[3,10],[12,16]]
Explanation: 因为新区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。
限制条件
0 <= intervals.length <= 10^4
intervals[i].length == 2
0 <= starti <= endi <= 10^5
intervals
按starti
升序排序。newInterval.length == 2
0 <= start <= end <= 10^5
解题思路
方法
这个解决方案用于解决 “57. Insert Interval” 问题,即在一个按起始位置升序排列的非重叠区间数组 intervals
中插入一个新区间 newInterval
,并返回合并后的区间列表。解法涉及在合适的位置插入新区间,并合并所有重叠的区间。
-
添加新区间之前的区间:
- 初始化一个空的结果数组
result
。 - 遍历
intervals
,将所有结束位置小于newInterval
起始位置的区间添加到result
中。
- 初始化一个空的结果数组
-
合并重叠区间:
- 继续遍历
intervals
,对于每个与newInterval
重叠的区间(即起始位置小于等于newInterval
的结束位置的区间):- 更新
newInterval
的起始位置为当前区间和newInterval
起始位置的最小值。 - 更新
newInterval
的结束位置为当前区间和newInterval
结束位置的最大值。
- 更新
- 继续遍历
-
添加合并后的新区间:
- 将更新后的
newInterval
添加到result
中。
- 将更新后的
-
添加新区间之后的区间:
- 继续遍历
intervals
,将剩余的区间添加到result
中。
- 继续遍历
-
返回结果:
- 返回合并后的区间列表
result
。
- 返回合并后的区间列表
代码
class Solution {
public:
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
vector<vector<int>> result;
int i = 0, n = intervals.size();
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;
}
};