[Registros] El K-ésimo elemento más grande en la matriz leetcode215

Enlace a tema: 215. El K-ésimo elemento más grande en una matriz - LeetCode

tallo de la pregunta:

Dada una matriz de enteros nums y un entero k, devuelva el k-ésimo elemento más grande de la matriz.

Tenga en cuenta que está buscando el k-ésimo elemento más grande de la matriz ordenada, no el k-ésimo elemento distinto.

Debe diseñar e implementar un algoritmo con complejidad temporal O(n) para resolver este problema.

Ejemplo 1:

Entrada: [3,2,1,5,6,4], k = 2
Salida: 5
Ejemplo 2:

Entrada: [3,2,3,1,2,4,5,5,6], k = 4
Salida: 4

Análisis del tema:

Al ver los k-ésimos datos más grandes y los k más grandes podemos pensar en dos soluciones

  1. Ordenar, luego encontrar el valor en la k-ésima posición
  2. construir pila

Aquí, si usamos directamente la ordenación para hacer esta pregunta, sería demasiado frustrante y la eficiencia es demasiado baja, por lo que preferimos construir montones. De forma predeterminada, se crea un montón grande y el resultado de la k-ésima aparición después de que se construye el montón es el valor que estamos buscando.

Optimización: aquí, para que todo el arreglo construya un montón, si el arreglo es grande pero k es pequeño, entonces la eficiencia de la solución anterior no es lo suficientemente extrema. En este momento, podemos considerar construir un pequeño montón de k elementos , y luego recorrer toda la matriz. Juzgue los datos actuales en la parte superior del montón y el tamaño de nums[i] . Si nums[i] es más grande, extraiga los datos en la parte superior del montón, luego inserte nums[i ] en el montón, y luego inserte los datos en la matriz. Cuando se completa el recorrido Cuando se completa la matriz completa, los primeros k datos más grandes están en el montón que construimos , y en este momento el k-ésimo número más grande es el elemento en la parte superior del montón. Para esta solución, su complejidad temporal es O(K+(NK)logK).

Código:

//解法一
class Solution {
    
    
public:
    int findKthLargest(vector<int>& nums, int k) {
    
    
        priority_queue<int> heap(nums.begin(), nums.end());
        while(--k)
        {
    
    
            heap.pop();
        }
        return heap.top();
    }
};

imagen-20230427161022533

//优化
class Solution {
    
    
public:
    int findKthLargest(vector<int>& nums, int k) {
    
    
        priority_queue<int, vector<int>, greater<int>> heap(nums.begin(), nums.begin() + k);
        for(size_t i = k; i < nums.size(); ++i)
        {
    
    
            if(nums[i] > heap.top())
            {
    
    
                heap.pop();
                heap.push(nums[i]);
            }
        }
        return heap.top();
    }
};

imagen-20230427163014759

Supongo que te gusta

Origin blog.csdn.net/weixin_63249832/article/details/130409960
Recomendado
Clasificación