tema
Dada una matriz de intervalos intervals, donde intervals[i] = [starti, endi], y cada starti es diferente.
El intervalo en el lado derecho del intervalo i se puede registrar como intervalo j, y satisface startj >= endi, y startj se minimiza.
Devuelve una matriz de los subíndices correspondientes en intervalos para los intervalos a la derecha de cada intervalo i. Si no hay un intervalo derecho correspondiente para un intervalo i, el valor del subíndice i se establece en -1.
Ejemplo 1:
Entrada: intervalos = [[1,2]]
Salida: [-1]
Explicación: Solo hay un intervalo en el conjunto, por lo que genera -1.
Ejemplo 2:
Entrada: intervalos = [[3,4],[2,3],[1,2]]
Salida: [-1,0,1]
Explicación: Para [3,4], no hay un "lado derecho" que satisface el intervalo de condición.
Para [2,3], el intervalo [3,4] tiene el punto inicial "derecho" más pequeño;
para [1,2], el intervalo [2,3] tiene el punto inicial "derecho" más pequeño.
Ejemplo 3:
Entrada: intervalos = [[1,4],[2,3],[3,4]]
Salida: [-1,2,-1]
Explicación: Para los intervalos [1,4] y [3,4] , No existe un intervalo "correcto" que satisfaga la condición.
Para [2,3], el intervalo [3,4] tiene el punto de inicio "derecho" más pequeño.
pista:
1 <= intervalos.longitud <= 2 * 104
intervalos[i].longitud == 2
-106 <= starti <= endi <= 106
El punto de inicio de cada intervalo es diferente
respuesta
Clasificación + búsqueda binaria
Almacenar el valor de la izquierda del par de números y el subíndice correspondiente y ordenarlo
Recorrer la matriz de intervalos, usar la búsqueda binaria para cada valor de la derecha para encontrar el valor de la izquierda mayor o igual que el valor de la derecha
class Solution {
public:
vector<int> findRightInterval(vector<vector<int>>& intervals) {
int n = intervals.size();
if(n==1)
return {
-1};
vector<int> res(n,-1);
vector<pair<int,int>> left_nums;
for(int i=0;i<n;i++)
{
left_nums.emplace_back(intervals[i][0],i);
}
sort(left_nums.begin(),left_nums.end());
for(int i=0;i<n;i++)
{
auto bound = lower_bound(left_nums.cbegin(),left_nums.cend(),pair<int,int>(intervals[i][1],0));
if(bound != left_nums.end())
res[i] = bound->second;
}
return res;
}
};
puntero doble
class Solution {
public:
vector<int> findRightInterval(vector<vector<int>>& intervals) {
int n = intervals.size();
vector<pair<int,int>> left_vals;
vector<pair<int,int>> right_vals;
vector<int> res(n,-1);
for(int i=0;i<n;i++)
{
left_vals.emplace_back(make_pair(intervals[i][0],i));
right_vals.emplace_back(make_pair(intervals[i][1],i));
}
sort(left_vals.begin(),left_vals.end());
sort(right_vals.begin(),right_vals.end());
int i=0,j=0;
while(i!=n && j!=n)
{
while(i!=n && left_vals[i].first < right_vals[j].first)
i++;
if(i<n)
res[right_vals[j].second] = left_vals[i].second;
j++;
}
return res;
}
};