【LeetCode】436 Encuentra el intervalo correcto

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;
    }
};

Supongo que te gusta

Origin blog.csdn.net/qq_45972928/article/details/126370117
Recomendado
Clasificación