#include <stdlib.h>
static int *copyInterval(int start, int end) {
int *p = malloc(2 * sizeof(int));
p[0] = start;
p[1] = end;
return p;
}
int **insert(int **intervals, int intervalsSize, int *intervalsColSize,
int *newInterval, int newIntervalSize, int *returnSize,
int **returnColumnSizes) {
(void)intervalsColSize;
(void)newIntervalSize;
int **result = malloc((intervalsSize + 1) * sizeof(int *));
int n = 0, i = 0;
int start = newInterval[0], end = newInterval[1];
// 1. Intervals entirely before newInterval
while (i < intervalsSize && intervals[i][1] < start) {
result[n++] = copyInterval(intervals[i][0], intervals[i][1]);
i++;
}
// 2. Intervals overlapping newInterval: absorb them into it
while (i < intervalsSize && intervals[i][0] <= end) {
if (intervals[i][0] < start)
start = intervals[i][0];
if (intervals[i][1] > end)
end = intervals[i][1];
i++;
}
result[n++] = copyInterval(start, end);
// 3. Intervals entirely after newInterval
while (i < intervalsSize) {
result[n++] = copyInterval(intervals[i][0], intervals[i][1]);
i++;
}
*returnSize = n;
*returnColumnSizes = malloc(n * sizeof(int));
for (int j = 0; j < n; j++)
(*returnColumnSizes)[j] = 2;
return result;
}
#include <algorithm>
#include <vector>
using namespace std;
class Solution {
public:
vector<vector<int>> insert(vector<vector<int>> &intervals,
vector<int> &newInterval) {
vector<vector<int>> result;
int i = 0, n = intervals.size();
// 1. Intervals entirely before newInterval
while (i < n && intervals[i][1] < newInterval[0])
result.push_back(intervals[i++]);
// 2. Intervals overlapping newInterval: absorb them into it
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);
// 3. Intervals entirely after newInterval
while (i < n)
result.push_back(intervals[i++]);
return result;
}
};
package intervals
func insert(intervals [][]int, newInterval []int) [][]int {
result := [][]int{}
i, n := 0, len(intervals)
// 1. Intervals entirely before newInterval
for i < n && intervals[i][1] < newInterval[0] {
result = append(result, intervals[i])
i++
}
// 2. Intervals overlapping newInterval: absorb them into it
for 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 = append(result, newInterval)
// 3. Intervals entirely after newInterval
return append(result, intervals[i:]...)
}
import java.util.ArrayList;
import java.util.List;
class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
List<int[]> result = new ArrayList<>();
int i = 0, n = intervals.length;
// 1. Intervals entirely before newInterval
while (i < n && intervals[i][1] < newInterval[0])
result.add(intervals[i++]);
// 2. Intervals overlapping newInterval: absorb them into it
while (i < n && intervals[i][0] <= newInterval[1]) {
newInterval[0] = Math.min(newInterval[0], intervals[i][0]);
newInterval[1] = Math.max(newInterval[1], intervals[i][1]);
i++;
}
result.add(newInterval);
// 3. Intervals entirely after newInterval
while (i < n)
result.add(intervals[i++]);
return result.toArray(new int[0][]);
}
}
/**
* @param {number[][]} intervals
* @param {number[]} newInterval
* @return {number[][]}
*/
var insert = function (intervals, newInterval) {
const result = [];
let i = 0;
const n = intervals.length;
// 1. Intervals entirely before newInterval
while (i < n && intervals[i][1] < newInterval[0]) result.push(intervals[i++]);
// 2. Intervals overlapping newInterval: absorb them into it
while (i < n && intervals[i][0] <= newInterval[1]) {
newInterval[0] = Math.min(newInterval[0], intervals[i][0]);
newInterval[1] = Math.max(newInterval[1], intervals[i][1]);
i++;
}
result.push(newInterval);
// 3. Intervals entirely after newInterval
while (i < n) result.push(intervals[i++]);
return result;
};
from typing import List
class Solution:
def insert(
self, intervals: List[List[int]], newInterval: List[int]
) -> List[List[int]]:
result = []
i, n = 0, len(intervals)
# 1. Intervals entirely before newInterval
while i < n and intervals[i][1] < newInterval[0]:
result.append(intervals[i])
i += 1
# 2. Intervals overlapping newInterval: absorb them into it
while i < n and intervals[i][0] <= newInterval[1]:
newInterval[0] = min(newInterval[0], intervals[i][0])
newInterval[1] = max(newInterval[1], intervals[i][1])
i += 1
result.append(newInterval)
# 3. Intervals entirely after newInterval
result.extend(intervals[i:])
return result
impl Solution {
pub fn insert(intervals: Vec<Vec<i32>>, mut new_interval: Vec<i32>) -> Vec<Vec<i32>> {
let mut result = Vec::with_capacity(intervals.len() + 1);
let mut i = 0;
let n = intervals.len();
// 1. Intervals entirely before new_interval
while i < n && intervals[i][1] < new_interval[0] {
result.push(intervals[i].clone());
i += 1;
}
// 2. Intervals overlapping new_interval: absorb them into it
while i < n && intervals[i][0] <= new_interval[1] {
new_interval[0] = new_interval[0].min(intervals[i][0]);
new_interval[1] = new_interval[1].max(intervals[i][1]);
i += 1;
}
result.push(new_interval);
// 3. Intervals entirely after new_interval
result.extend_from_slice(&intervals[i..]);
result
}
}