Pregunta diaria de Leetcode: 57. Insertar intervalo

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
  • intervalsOrdenar en intervals[i][0]orden ascendente
  • newInterval.length == 2
  • 0 <= newInterval[0] <= newInterval[1] <= 105

Sitio web oficial de LeetCode: la plataforma de crecimiento tecnológico amada por los geeks de todo el mundo

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.

Supongo que te gusta

Origin blog.csdn.net/Mamong/article/details/132532484
Recomendado
Clasificación