## [57\. Insert Interval](https://leetcode.com/problems/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_.
**Note** that you don't need to modify `intervals` 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:**
- `0 <= intervals.length <= 104`
- `intervals[i].length == 2`
- `0 <= starti <= endi <= 105`
- `intervals` is sorted by `starti` in **ascending** order.
- `newInterval.length == 2`
- `0 <= start <= end <= 105`
```cpp=
class Solution {
public:
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
intervals.push_back(newInterval);
sort(intervals.begin(), intervals.end());
vector<vector<int>> res;
res.push_back(intervals[0]);
// intervals = [[1, 3], [2, 5], [6, 9]]
for(int i = 1; i < intervals.size(); i++) {
if(intervals[i][0] <= res.back()[1]) {
res.back()[1] = max(res.back()[1], intervals[i][1]);
} else {
res.push_back(intervals[i]);
}
}
return res;
}
};
```
:::success
- 時間複雜度:$O(N \cdot \log N)$
- 空間複雜度:$O(N)$
:::
Binary Search
```cpp=
class Solution {
public:
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
int n = intervals.size();
if(n == 0) return {newInterval};
// Binary Search 尋找要插入的區間
int left = 0, right = n - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (intervals[mid][0] < newInterval[0]) {
left = mid + 1;
} else {
right = mid - 1;
}
}
// 插入區間
intervals.insert(intervals.begin() + left, newInterval);
// 處理重疊區間
vector<vector<int>> res;
for (auto& interval : intervals) {
if (res.empty() || res.back()[1] < interval[0]) {
res.push_back(interval);
} else {
res.back()[1] = max(res.back()[1], interval[1]);
}
}
return res;
}
};
```
:::success
- 時間複雜度:$O(N + \log N)$
- 空間複雜度:$O(N)$
:::