# 链接 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]需要合并,如图: 对于这种情况,只要是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]不用合并,插入区间直接插入就行,如图: 对于这种情况,就直接把newInterval放入result就可以了 ## 步骤三:处理合并区间之后的区间 合并之后,就应该把合并之后的区间,以此加入result中。 代码如下: ``` while (index < intervals.size()) { result.push_back(intervals[index++]); } ``` # 整体C++代码 ``` class Solution { public: vector> insert(vector>& intervals, vector& newInterval) { vector> 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; } }; ```