Likou 703 O maior elemento K no fluxo de dados (método multiset)

Título original: 703. O maior elemento K no fluxo de dados

 

Projete uma classe que encontre o k-ésimo maior elemento no fluxo de dados. Observe que é o k-ésimo maior elemento após a classificação, não o k-ésimo elemento diferente.

Implemente a classe KthLargest:

KthLargest (int k, int [] nums) inicializa o objeto usando números inteiros k e números inteiros de fluxo.
int add (int val) Depois de inserir val no fluxo de dados nums, retorne o k-ésimo maior elemento no fluxo de dados atual.
 

Exemplo:

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

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

Prompt:
1 <= k <= 104
0 <= nums.length <= 104
-104 <= nums [i] <= 104
-104 <= val <= 104 O
método add pode ser chamado até 104 vezes
. Quando k elementos grandes, há pelo menos k elementos na matriz

 

        Obviamente, encontrar o k-ésimo maior elemento no fluxo de dados requer classificação. Se você não usar nenhuma estrutura de dados, primeiro classifique os números de entrada iniciais e, em seguida, insira os dados inseridos nos números após encontrar a posição, por sua vez, mas a implementação é mais lenta e o efeito não é muito objetivo. Aqui, você pode usar as características do multiset, ou seja, o multiset inserido em qualquer ordem está sempre em ordem (do pequeno ao grande), e o número pode ser repetido, como inserir 4, 5, 8, 2, e a ordem no multiconjunto. É 2, 4, 5 e 8, o que economiza o tempo da classificação inicial manual e da classificação de inserção subsequente. Como você deseja produzir o k-ésimo maior elemento, o tamanho deste multiset pode ser controlado para k. Quando o tamanho do multiset excede k após a inserção de dados, a exclusão do primeiro elemento do multiset realiza o controle do tamanho de k, e agora o tamanho deste multiconjunto Os elementos k são os maiores k no fluxo de dados de entrada.

        Portanto, em KthLargest, os números iniciais são inseridos sequencialmente no multiset e, se o tamanho exceder k, o primeiro elemento é excluído. Da mesma forma, em add, insira val primeiro, se for maior que k, exclua o primeiro elemento (talvez o tamanho do fluxo de dados inicial seja menor que k, então você precisa avaliar antes de excluir, caso contrário, o tamanho do multiset é sempre menor que k ) e, em seguida, retornar Basta excluir o primeiro elemento. Precisa saber o tamanho k na função add, mas não nos parâmetros de entrada fornecidos, então uma variável global kk é definida para salvar o 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);
 */

 

Acho que você gosta

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