57. Insert Interval
Вам дан 배열 непересекающихся интервалов
intervals
, где
intervals[i] = [starti, endi]
представляет начало и конец i-го интервала, и 배열
intervals
отсортирован в порядке возрастания по
starti
. Вам также дан интервал
newInterval = [start, end]
, представляющий начало и конец другого интервала.
Вставьте
newInterval
в 배열
intervals
так, чтобы
intervals
оставался отсортированным в порядке возрастания по
starti
и в
intervals
не было бы перекрывающихся интервалов (при необходимости объедините перекрывающиеся интервалы).
return 배열
intervals
после вставки.
Обратите внимание, что не обязательно модифицировать 배열
intervals
на месте. Вы можете создать новый 배열 и вернуть его.
예제
Input: intervals = [[1,3],[6,9]], newInterval = [2,5]
Output: [[1,5],[6,9]]
C# 해법
매칭됨/원본public class Solution {
public int[][] Insert(int[][] intervals, int[] newInterval) {
int n = intervals.Length, i = 0;
List<int[]> res = new List<int[]>();
while (i < n && intervals[i][1] < newInterval[0]) {
res.Add(intervals[i]);
i++;
}
while (i < n && newInterval[1] >= intervals[i][0]) {
newInterval[0] = Math.Min(newInterval[0], intervals[i][0]);
newInterval[1] = Math.Max(newInterval[1], intervals[i][1]);
i++;
}
res.Add(newInterval);
while (i < n) {
res.Add(intervals[i]);
i++;
}
return res.ToArray();
}
}
C++ 해법
자동 초안, 제출 전 검토#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public int[][] Insert(int[][] intervals, vector<int>& newInterval) {
int n = intervals.size(), i = 0;
List<int[]> res = new List<int[]>();
while (i < n && intervals[i][1] < newInterval[0]) {
res.push_back(intervals[i]);
i++;
}
while (i < n && newInterval[1] >= intervals[i][0]) {
newInterval[0] = min(newInterval[0], intervals[i][0]);
newInterval[1] = max(newInterval[1], intervals[i][1]);
i++;
}
res.push_back(newInterval);
while (i < n) {
res.push_back(intervals[i]);
i++;
}
return res.ToArray();
}
}
Java 해법
매칭됨/원본class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
int n = intervals.length, i = 0;
List<int[]> res = new ArrayList<>();
while (i < n && intervals[i][1] < newInterval[0]) {
res.add(intervals[i]);
i++;
}
while (i < n && newInterval[1] >= intervals[i][0]) {
newInterval[0] = Math.min(newInterval[0], intervals[i][0]);
newInterval[1] = Math.max(newInterval[1], intervals[i][1]);
i++;
}
res.add(newInterval);
while (i < n) {
res.add(intervals[i]);
i++;
}
return res.toArray(new int[res.size()][]);
}
}
JavaScript 해법
매칭됨/원본var insert = function (intervals, newInterval) {
let n = intervals.length,
i = 0,
res = [];
while (i < n && intervals[i][1] < newInterval[0]) {
res.push(intervals[i]);
i++;
}
while (i < n && newInterval[1] >= intervals[i][0]) {
newInterval[0] = Math.min(newInterval[0], intervals[i][0]);
newInterval[1] = Math.max(newInterval[1], intervals[i][1]);
i++;
}
res.push(newInterval);
while (i < n) {
res.push(intervals[i]);
i++;
}
return res;
};
Python 해법
매칭됨/원본class Solution:
def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
n = len(intervals)
i = 0
res = []
while i < n and intervals[i][1] < newInterval[0]:
res.append(intervals[i])
i += 1
while i < n and newInterval[1] >= intervals[i][0]:
newInterval[0] = min(newInterval[0], intervals[i][0])
newInterval[1] = max(newInterval[1], intervals[i][1])
i += 1
res.append(newInterval)
while i < n:
res.append(intervals[i])
i += 1
return res
Go 해법
매칭됨/원본func insert(intervals [][]int, newInterval []int) [][]int {
n := len(intervals)
i := 0
res := make([][]int, 0)
for i < n && intervals[i][1] < newInterval[0] {
res = append(res, intervals[i])
i++
}
for i < n && newInterval[1] >= intervals[i][0] {
newInterval[0] = min(newInterval[0], intervals[i][0])
newInterval[1] = max(newInterval[1], intervals[i][1])
i++
}
res = append(res, newInterval)
for i < n {
res = append(res, intervals[i])
i++
}
return res
}
func min(x, y int) int {
if x < y {
return x
}
return y
}
func max(x, y int) int {
if x > y {
return x
}
return y
}
Algorithm
1️⃣
Инициализация переменных:
Инициализируются переменные n и i для хранения размера 배열а интервалов и текущего индекса соответственно, а также пустой 배열 res для хранения результата.
2️⃣
Обработка случаев без перекрытия и с перекрытием:
В случае отсутствия перекрытия до вставки, проходим через 배열 интервалов до тех пор, пока конечная точка текущего интервала меньше начальной точки нового интервала. Добавляем текущий интервал в 배열 res и переходим к следующему.
В случае перекрытия, продолжаем обход, пока начальная точка нового интервала меньше или равна конечной точке текущего интервала. Обновляем начальные и конечные точки нового интервала, объединяя перекрывающиеся интервалы в один.
3️⃣
Обработка интервалов после вставки:
Проходим через оставшиеся интервалы после индекса i и добавляем их в 배열 res. Это включает интервалы, которые следуют после нового интервала и не перекрываются с ним.
Возвращаем 배열 res, содержащий все интервалы с корректно вставленным новым интервалом.
😎
Vacancies for this task
활성 채용 with overlapping task tags are 표시됨.