Trouvez le nombre avec plus de la moitié des occurrences dans le tableau

Trouvez le nombre avec plus de la moitié des occurrences dans le tableau

Description du titre

Étant donné un tableau d'entiers arr, veuillez imprimer le nombre dont le nombre d'occurrences est supérieur à la moitié. S'il n'y en a pas, veuillez indiquer -1.

Entrez une description:

L'entrée contient deux lignes, la première ligne contient un entier n (1 ≤ n ≤ 1 0 5) n (1 \ leq n \ leq 10 ^ 5)n ( 1n1 05 )représente la longueur du tableau, la deuxième ligne contient n nombres, représentant le tableauarr (1 ≤ arri ≤ 1 0 9) arr (1 \ leq arr_i \ leq 10 ^ 9)a r r ( 1a r rJe1 09 )

Description de la sortie:

Affiche un entier, qui représente le nombre avec plus de la moitié des occurrences. S'il n'y en a pas, veuillez indiquer «-1».

Exemple 1
entrer
5
11 7 5 7 7
Production
7
Exemple 2
entrer
4
2 2 3 3
Production
-1
Remarques:

Complexité temporelle O (n) O (n)O ( n ) , complexité spatiale supplémentaireO (1) O (1)O ( 1 )


répondre:

La solution conventionnelle peut essayer d'utiliser une table de hachage pour enregistrer le nombre d'occurrences de chaque élément, mais la complexité d'espace supplémentaire ne répond pas aux exigences du problème. Considérez une approche relativement nouvelle: chaque fois que nous supprimons deux éléments différents, s'il y a un élément qui apparaît plus de la moitié du temps dans la séquence, alors l'élément sera définitivement conservé à la fin. Dans ce cas, nous pouvons le faire avec seulement deux variables (voir le code pour plus de détails).

Remarque: Le dernier élément enregistré n'est pas nécessairement l'élément avec plus de la moitié des occurrences. Vous devez également parcourir le tableau et le confirmer.

Code:
#include <cstdio>

using namespace std;

const int N = 100010;

int n;
int a[N];

int main(void) {
    
    
    scanf("%d", &n);
    int cand = 0;
    int times = 0;
    for ( int i = 0; i < n; ++i ) {
    
    
        scanf("%d", a + i);
        if ( !times ) {
    
    
            cand = a[i];
            times = 1;
        } else if ( a[i] == cand ) ++times;
        else --times;
    }
    if ( !cand ) return 0 * puts("-1");
    times = 0;
    int mid = n >> 1;
    for ( int i = 0; i < n && times <= mid; ++i ) times += ( a[i] == cand );
    if ( times > mid ) printf("%d\n", cand);
    else puts("-1");
    return 0;
}

Je suppose que tu aimes

Origine blog.csdn.net/MIC10086/article/details/109277514
conseillé
Classement