Titulo original
Proporcionarle una lista no superpuesta de intervalos ordenados por los puntos inicial y final de los intervalos.
Al insertar un nuevo rango en una lista, debe asegurarse de que los rangos de la lista todavía estén ordenados y no se superpongan (fusionando rangos si es necesario).
Ejemplo 1:
Entrada: intervalos = [[1,3],[6,9]], nuevoIntervalo = [2,5] Salida: [[1,5],[6,9]]
Ejemplo 2:
Entrada: intervalos = [[1,2],[3,5],[6,7],[8,10],[12,16]], nuevoIntervalo = [4,8] Salida: [ [ 1,2 ],[3,10],[12,16]] Explicación: Esto se debe a que el nuevo intervalo se superpone[4,8]
con[3,5],[6,7],[8,10]
.
Ejemplo 3:
Entrada: intervalos = [], nuevoIntervalo = [5,7] Salida: [[5,7]]
Ejemplo 4:
Entrada: intervalos = [[1,5]], nuevoIntervalo = [2,3] Salida: [[1,5]]
Ejemplo 5:
Entrada: intervalos = [[1,5]], nuevoIntervalo = [2,7] Salida: [[1,7]]
pista:
0 <= intervals.length <= 104
intervals[i].length == 2
0 <= intervals[i][0] <= intervals[i][1] <= 105
intervals
Ordenar enintervals[i][0]
orden ascendentenewInterval.length == 2
0 <= newInterval[0] <= newInterval[1] <= 105
Ideas para resolver problemas
Considerando que los intervalos ya están ordenados y no se superponen, solo necesitamos sacar los intervalos uno por uno y compararlos con el intervalo newInterval a insertar. Dependiendo de la posición relativa del intervalo y del nuevo Intervalo y de si se superponen, la discusión se puede dividir en las siguientes situaciones:
1. Si el intervalo está en el lado izquierdo de newInterval y no hay superposición, inserte el intervalo y saque los intervalos posteriores para comparar.
2. Si el intervalo está en el lado derecho de newInterval y no hay superposición, primero inserte newInterval, luego inserte el intervalo y luego inserte el intervalo restante directamente.
3. Si el intervalo y el nuevo Intervalo se superponen, combine el intervalo y el nuevo Intervalo como un nuevo intervalo nuevo y elimine los intervalos posteriores para compararlos.
Por conveniencia, necesitamos usar un indicador para registrar si se ha insertado un nuevo Intervalo. Si el recorrido del intervalo finaliza y no se ha insertado un nuevo Intervalo, se insertará hasta el final.
La implementación completa es la siguiente:
class Solution {
public:
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
int left = newInterval[0];
int right = newInterval[1];
bool placed = false;
vector<vector<int>> ans;
for (const auto& interval: intervals) {
if(interval[0] > right ){
if(!placed){
ans.push_back({left,right});
placed=true;
}
ans.push_back(interval);
}else if(interval[1] < left){
ans.push_back(interval);
}else{
left = min(left,interval[0]);
right = max(right,interval[1]);
}
}
if(!placed){
ans.push_back({left,right});
}
return ans;
}
};
Una cosa a tener en cuenta aquí es que a menudo usamos emplace_back en C++ para optimizar el rendimiento de la inserción. Pero no podemos usar emplace_back aquí, porque emplace_back(1,5) en realidad inserta vector<int>(1,5) en lugar de vector<int>{1,5}. El primero es un vector con un solo elemento 5, y el este último es un vector de dos elementos 1 y 5.