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