Encuentre el número con más de la mitad de las ocurrencias en la matriz

Encuentre el número con más de la mitad de las ocurrencias en la matriz

Descripción del Título

Dado un arreglo de entero entero, imprima el número cuyo número de ocurrencias sea mayor que la mitad. Si no existe tal número, por favor envíe -1.

Ingrese una descripción:

La entrada contiene dos líneas, la primera línea contiene un número entero n (1 ≤ n ≤ 1 0 5) n (1 \ leq n \ leq 10 ^ 5)n ( 1norte1 05 )representa la longitud de la matriz, la segunda línea contiene n números, que representan la matrizarr (1 ≤ arri ≤ 1 0 9) arr (1 \ leq arr_i \ leq 10 ^ 9)a r r ( 1a r ryo1 09 )

Descripción de salida:

Genere un número entero, que representa el número con más de la mitad de las apariciones. Si no existe tal número, envíe '-1'.

Ejemplo 1
entrar
5
11 7 5 7 7
Salida
7
Ejemplo 2
entrar
4
2 2 3 3
Salida
-1
Observaciones:

Complejidad temporal O (n) O (n)O ( n ) , complejidad espacial adicionalO (1) O (1)O ( 1 )


responder:

La solución convencional puede intentar utilizar una tabla hash para registrar el número de apariciones de cada elemento, pero la complejidad del espacio adicional no cumple con los requisitos del problema. Considere un enfoque relativamente novedoso: cada vez que eliminamos dos elementos diferentes, si hay un elemento que aparece más de la mitad del tiempo en la secuencia, el elemento se retendrá al final. En este caso, podemos hacerlo con solo dos variables (ver el código para más detalles).

Nota: El último elemento guardado no es necesariamente el elemento con más de la mitad de las ocurrencias. También es necesario recorrer la matriz y confirmarla.

Código:
#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;
}

Supongo que te gusta

Origin blog.csdn.net/MIC10086/article/details/109277514
Recomendado
Clasificación