91 lines
2.4 KiB
Markdown
91 lines
2.4 KiB
Markdown
|
||
# 链接
|
||
https://leetcode-cn.com/problems/insert-interval/
|
||
|
||
# 思路
|
||
这道题目合并的情况有很多种,想想都让人头疼。
|
||
|
||
我把这道题目化为三步:
|
||
|
||
## 步骤一:找到需要合并的区间
|
||
|
||
找到插入区间需要插入或者合并的位置。
|
||
|
||
代码如下:
|
||
|
||
```
|
||
int index = 0; // intervals的索引
|
||
while (index < intervals.size() && intervals[index][1] < newInterval[0]) {
|
||
result.push_back(intervals[index++]);
|
||
}
|
||
```
|
||
|
||
此时intervals[index]就需要合并的区间了
|
||
|
||
## 步骤二:合并区间
|
||
|
||
合并区间还有两种情况
|
||
|
||
1. intervals[index]需要合并,如图:
|
||
|
||
<img src='../pics/57.插入区间.png' width=600> </img></div>
|
||
|
||
对于这种情况,只要是intervals[index]起始位置 <= newInterval终止位置,就要一直合并下去。
|
||
|
||
代码如下:
|
||
|
||
```
|
||
while (index < intervals.size() && intervals[index][0] <= newInterval[1]) { // 注意防止越界
|
||
newInterval[0] = min(intervals[index][0], newInterval[0]);
|
||
newInterval[1] = max(intervals[index][1], newInterval[1]);
|
||
index++;
|
||
}
|
||
```
|
||
合并之后,将newInterval放入result就可以了
|
||
|
||
2. intervals[index]不用合并,插入区间直接插入就行,如图:
|
||
|
||
<img src='../pics/57.插入区间1.png' width=600> </img></div>
|
||
|
||
对于这种情况,就直接把newInterval放入result就可以了
|
||
|
||
## 步骤三:处理合并区间之后的区间
|
||
|
||
合并之后,就应该把合并之后的区间,以此加入result中。
|
||
|
||
代码如下:
|
||
|
||
```
|
||
while (index < intervals.size()) {
|
||
result.push_back(intervals[index++]);
|
||
}
|
||
```
|
||
|
||
# 整体C++代码
|
||
|
||
```
|
||
class Solution {
|
||
public:
|
||
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
|
||
vector<vector<int>> result;
|
||
int index = 0; // intervals的索引
|
||
// 步骤一:找到需要合并的区间
|
||
while (index < intervals.size() && intervals[index][1] < newInterval[0]) {
|
||
result.push_back(intervals[index++]);
|
||
}
|
||
// 步骤二:合并区间
|
||
while (index < intervals.size() && intervals[index][0] <= newInterval[1]) {
|
||
newInterval[0] = min(intervals[index][0], newInterval[0]);
|
||
newInterval[1] = max(intervals[index][1], newInterval[1]);
|
||
index++;
|
||
}
|
||
result.push_back(newInterval);
|
||
// 步骤三:处理合并区间之后的区间
|
||
while (index < intervals.size()) {
|
||
result.push_back(intervals[index++]);
|
||
}
|
||
return result;
|
||
}
|
||
};
|
||
```
|