[Requisitos de pergunta] fornecem n números e n. Agora você precisa encontrar o número que ocorre mais de 50% dos tempos no espaço O (n) dentro de O (1).
[Comece a besteira] No começo, vi essa pergunta cegada instantaneamente (TOT)/~~~ (.*). Se houver apenas o requisito de tempo de O (n), ele poderá ser resolvido instantaneamente com o hash (ou seja, com espaço para o tempo) e parece difícil resolver o espaço de O (1).
[Pensamento 1] Loop duplo, essa é a maneira menos eficiente de resolver esse problema, ou seja, calcular o número de vezes que ele aparece para cada número e a complexidade do tempo O (n^2) está diretamente divulgada.
[Pensamento 2] Primeiro classificação, deixe os números semelhantes serem organizados juntos e depois atravessarem o primeiro número. Agora dê um exemplo, como: 1000012, agora classifique: 0000112, inicie a partir de 0, defina um contador T = 0, agora existem 4 0s, depois t = 4, encontre que mais da metade deles, saída 0. Este método é a versão otimizada do método anterior.
[Pensamento 3] É a idéia de trocar espaço por tempo e hash para fazer uma matriz unidimensional ter dois significados. Por exemplo, a [x] = y representa que o número x aparece y vezes. A complexidade do tempo desse método é O (n), mas o espaço é realmente ... não vou falar sobre isso (*  ̄ ̄)
[Pensamento 4] Primeiro calcule a probabilidade, selecione o número desses números com maior probabilidade de atender aos requisitos e selecionar aleatoriamente alguns. Isso ... esqueça.
[Pensamento 5] O tópico de hoje é o chamado algoritmo MJRTY, também conhecido como algoritmo de votação majoritário. As principais idéias são as seguintes: ((A complexidade do tempo deste algoritmo é O (n)! Não há necessidade de armazenamento extra no espaço, então a complexidade do espaço é O (1) !!!)
Se count == 0, defina o valor do voto como o elemento atual da matriz e atribua a contagem para 1;
Caso contrário, se o voto e agora os elementos da matriz tiverem o mesmo valor, count ++, caso contrário, conte;
Repita as duas etapas acima até que a matriz seja digitalizada.
A contagem é atribuída a 0 e digitalize a matriz novamente desde o início. Se o valor do elemento da matriz for o mesmo que o valor do voto, conte ++ até que a matriz seja digitalizada.
Se o valor da contagem for maior ou igual a N/2 neste momento, o valor do voto será devolvido, caso contrário -1 será devolvido;
A seguir, a implementação do código. Como a pergunta garante que o resultado exista, omitimos a última etapa da verificação e verificação.
O código -chave é o seguinte:
#include <tostream> usando namespace std; int len; void encontre (int* a, int n) {char candidato; no tempo, i; para (i = nTimes = 0; i <n; i ++) {if (ntimes == 0) candidato = a [i], nTimes = 1; else {if (candidato == a [i]) nTiMESTS++; } int main () {cin >> len; int a [len]; para (int i = 0; i <n; i ++) cin >> a [i]; encontre (a, len); sistema ("pausa"); retornar 0;}O exposto acima é o número de mais da metade (50%) do número de ocorrências introduzidas pelo editor. Espero que seja útil para você. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a você a tempo. Muito obrigado pelo seu apoio ao site wulin.com!