# LC 57. Insert Interval
### [Problem link](https://leetcode.com/problems/insert-interval/)
###### tags: `leedcode` `medium` `c++`
You are given an array of non-overlapping intervals <code>intervals</code> where <code>intervals[i] = [start<sub>i</sub>, end<sub>i</sub>]</code> represent the start and the end of the <code>i<sup>th</sup></code> interval and <code>intervals</code> is sorted in ascending order by <code>start<sub>i</sub></code>. You are also given an interval <code>newInterval = [start, end]</code> that represents the start and end of another interval.
Insert <code>newInterval</code> into <code>intervals</code> such that <code>intervals</code> is still sorted in ascending order by <code>start<sub>i</sub></code> and <code>intervals</code> still does not have any overlapping intervals (merge overlapping intervals if necessary).
Return <code>intervals</code> after the insertion.
**Note** that you don't need to modify <code>intervals</code> in-place. You can make a new array and return it.
**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: Because the new interval [4,8] overlaps with [3,5],[6,7],[8,10].
```
**Constraints:**
- <code>0 <= intervals.length <= 10<sup>4</sup></code>
- <code>intervals[i].length == 2</code>
- <code>0 <= start<sub>i</sub> <= end<sub>i</sub> <= 10<sup>5</sup></code>
- <code>intervals</code> is sorted by <code>start<sub>i</sub></code> in **ascending** order.
- <code>newInterval.length == 2</code>
- <code>0 <= start <= end <= 10<sup>5</sup></code>
## Solution 1
#### C++
```cpp=
class Solution {
public:
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
int start = newInterval[0];
int end = newInterval[1];
vector<vector<int>> ans;
int i = 0;
while (i < intervals.size() && intervals[i][1] < start) {
ans.push_back(intervals[i]);
i++;
}
while (i < intervals.size() && intervals[i][0] <= end) {
start = min(start, intervals[i][0]);
end = max(end, intervals[i][1]);
i++;
}
ans.push_back({start, end});
while (i < intervals.size()) {
ans.push_back(intervals[i]);
i++;
}
return ans;
}
};
```
>### Complexity
>n = intervals.length
>| | Time Complexity | Space Complexity |
>| ----------- | --------------- | ---------------- |
>| Solution 1 | O(n) | O(1) |
## Note
sol1:
第一個while: 找到重疊前的最後一個interval.
第一個while: 所有intervals[1] <= end的都有可能與newInterval重疊.
第二個while: 之後的都不可能與newInterval重疊, 所以直接加到ans就好.
Space Complexity: 忽略return value的話是O(1)