leetcode 986 intersección de intervalo, recorrido de doble puntero

986. Intersección de listas de intervalos.

Dificultad moderada 283 Favoritos y uso compartido Cambie a inglés para recibir comentarios dinámicos

Dadas dos listas que constan de algunos  intervalos cerrados firstList ,  y  secondList , donde  firstList[i] = [starti, endi] y  secondList[j] = [startj, endj] . Cada lista de intervalos está  separada  y  ordenada por pares  .

Devuelve  la intersección de estas dos listas de intervalos  .

Formalmente, un intervalo cerrado [a, b] (donde  a <= b) representa  x el conjunto de números reales, mientras que  a <= x <= b .

La intersección de dos intervalos cerrados   es un conjunto de números reales, ya sea el conjunto vacío o un intervalo cerrado. Por ejemplo, la intersección de [1, 3] y  [2, 4] es  [2, 3] .

Ejemplo 1:

Entrada: primeraLista = [[0,2],[5,10],[13,23],[24,25]], segundaLista = [[1,5],[8,12],[15,24] ,[25,26]]
 Salida: [[1,2],[5,5],[8,10],[15,23],[24,24],[25,25]]

Ejemplo 2:

Entrada: primeraLista = [[1,3],[5,9]], segundaLista = []
 Salida: []

Ejemplo 3:

Entrada: primeraLista = [], segundaLista = [[4,8],[10,12]]
 Salida: []

Ejemplo 4:

Entrada: primeraLista = [[1,7]], segundaLista = [[3,10]]
 Salida: [[3,7]]

pista:

  • 0 <= firstList.length, secondList.length <= 1000
  • firstList.length + secondList.length >= 1
  • 0 <= starti < endi <= 109
  • endi < starti+1
  • 0 <= startj < endj <= 109
  • endj < startj+1

Número de pases: 44.426 Número de presentaciones: 64.986

 Solución: Esta pregunta no es difícil, simplemente encuentre la intersección de los intervalos, tenga en cuenta que todos son intervalos cerrados y luego recorra una vez para obtener el resultado. Mientras las ideas sean claras, el código se puede escribir una y otra vez.

class Solution {
public:
    vector<vector<int>> intervalIntersection(vector<vector<int>>& firstList, vector<vector<int>>& secondList) {
        vector<vector<int>> res;
        if(firstList.size()==0 || secondList.size()==0)
            return res;
        else
        {
            int i=0,j=0;
            while(i<firstList.size() && j<secondList.size())
            {
                // 如果没有交集的情况
                if(firstList[i][0]>secondList[j][1] || firstList[i][1]<secondList[j][0])
                {
                    if(firstList[i][0]>secondList[j][1])
                        j++;
                    else
                        i++;
                }
                else
                {
                    vector<int> tem;
                    int left=max(firstList[i][0],secondList[j][0]);
                    int right=min(firstList[i][1],secondList[j][1]);
                    tem.push_back(left);
                    tem.push_back(right);
                    res.push_back(tem);
                    if(firstList[i][1]<secondList[j][1])
                        i++;
                    else
                        j++;
                }
            }
            return res;
        }
    }
};

Resultados de:

aprobar

Mostrar detalles

Agregar notas

Tiempo de ejecución: 24 ms, superando el 92,77% de todos los envíos de C++

Consumo de memoria: 19,3 MB, supera al 8,99% de los usuarios entre todos los envíos de C++

Casos de prueba aprobados: 85/85

Supongo que te gusta

Origin blog.csdn.net/weixin_41579872/article/details/124918117
Recomendado
Clasificación