Likou 703 El Kth elemento más grande en el flujo de datos (método multiset)

Título original: 703. El Kth elemento más grande en el flujo de datos

 

Diseñe una clase que encuentre el k-ésimo elemento más grande en el flujo de datos. Tenga en cuenta que es el k-ésimo elemento más grande después de la clasificación, no el k-ésimo elemento diferente.

Implemente la clase KthLargest:

KthLargest (int k, int [] nums) inicializa el objeto usando números enteros k y números enteros de flujo.
int add (int val) Después de insertar val en el flujo de datos nums, devuelve el k-ésimo elemento más grande en el flujo de datos actual.
 

Ejemplo:

输入 :
["KthLargest", "agregar", "agregar", "agregar", "agregar", "agregar"]
[[3, [4, 5, 8, 2]], [3], [5], [10], [9], [4]]
输出 :
[nulo, 4, 5, 5, 8, 8]

解释 :
KthLargest kthLargest = nuevo KthLargest (3, [4, 5, 8, 2]);
kthLargest.add (3); // devuelve 4
kthLargest.add (5); // devuelve 5
kthLargest.add (10); // devuelve 5
kthLargest.add (9); // devuelve 8
kthLargest.add (4); // devuelve 8
 

Mensaje:
1 <= k <= 104
0 <= nums.length <=
104-104 <= nums [i] <=
104-104 <= val <= 104 El
método add se puede llamar hasta 104 veces
. Cuando k elementos grandes, hay al menos k elementos en la matriz

 

        Obviamente, encontrar el k-ésimo elemento más grande en el flujo de datos requiere una clasificación. Si no usa ninguna estructura de datos, primero ordene los números de entrada iniciales y luego inserte los datos insertados en los números después de encontrar la posición, pero la implementación es más lenta y el efecto no es muy objetivo. Aquí, puede utilizar las características de multiset, es decir, el multiset insertado en cualquier orden siempre está en orden (de pequeño a grande), y se puede permitir que el número se repita, como insertar 4, 5, 8, 2, y el orden en el multiset. Es 2, 4, 5 y 8, lo que ahorra el tiempo de la clasificación inicial manual y la clasificación de inserción posterior. Debido a que desea generar el k-ésimo elemento más grande, entonces el tamaño de este multiset se puede controlar hasta k. Cuando el tamaño del multiset excede k después de insertar los datos, al eliminar el primer elemento del multiset se realiza el control del tamaño de k, y ahora el tamaño de este multiset Los k elementos son los k más grandes en el flujo de datos de entrada.

        Por lo tanto, en KthLargest, los nums iniciales se insertan secuencialmente en el muliset, y si el tamaño excede k, se elimina el primer elemento. De manera similar, agregue, inserte primero val, si es mayor que k, elimine el primer elemento (tal vez el tamaño del flujo de datos inicial sea menor que k, por lo que debe juzgar antes de eliminar, de lo contrario, el tamaño de multiset siempre es menor que k ), y luego regrese Simplemente elimine el primer elemento. Es necesario conocer el tamaño k en la función de suma, pero no en los parámetros de entrada dados, por lo que se define una variable global kk para guardar el valor de k.

class KthLargest {
    multiset <int> topk;
    int kk;
public:
    KthLargest(int k, vector<int>& nums) {
        kk=k;
        for(int i=0;i<nums.size();i++){
            topk.insert(nums[i]);
            if(topk.size()>k)
                topk.erase(topk.begin());
        }
    }
    
    int add(int val) {
        topk.insert(val);
        if(topk.size()>kk)
            topk.erase(topk.begin());
        return *topk.begin();
    }
};

/**
 * Your KthLargest object will be instantiated and called as such:
 * KthLargest* obj = new KthLargest(k, nums);
 * int param_1 = obj->add(val);
 */

 

Supongo que te gusta

Origin blog.csdn.net/qq_36614557/article/details/114263559
Recomendado
Clasificación