Preguntas algorítmicas: análisis de más de la mitad de las preguntas numéricas de la matriz

Descripción del Título

Hay un número en la matriz que parece más de la mitad de la longitud de la matriz. Averigüe este número. Por ejemplo, ingrese una matriz {1,2,3,2,2,2,5,4,2} de longitud 9. Dado que el número 2 aparece 5 veces en la matriz, que es más de la mitad de la longitud de la matriz, se emite 2. Si no existe, salida 0.

Análisis de temas

Dado que hay un cierto número a, que representa más de la mitad de la matriz, si el número ay otros números se cancelan entre sí, se puede dejar al menos un número a, por lo que puede usar este método: recuerde primero el primer número e inicialice un recuento , Si se recorre más tarde, si es el mismo número, aumentará el conteo (se superpone el mismo número), si es diferente, el conteo disminuirá (diferentes números se cancelan entre sí), si el conteo se vuelve 0, entonces este número no se recordará y el siguiente se recordará nuevamente. Tales como:
1,2,3,2,2,2,5,4,2
1: Primero recuerde 1, cuente = 1
2: No es lo mismo que el 1 recordado, el recuento es menor que 0, descarte el 1 recordado
3: Recuerde 3, cuente = 1
2: Descarte 3, cuente = 0
2: Recuerde 2, cuente = 1
2: Igual que recordado, cuente = 2
5: No es lo mismo, cuente = 1
4: No lo mismo , Cuenta = 0, descarta 2
2: Recuerda 2, cuenta = 1,
entonces obtienes 2

Si cuenta = 0, significa que ningún número es más de la mitad, y no debe haber respuesta.
Si cuenta = 1, puede haber una respuesta, porque diferentes números se cancelarán entre sí y el número obtenido no es necesariamente más de la mitad, como por ejemplo: 1, 2, 3, 4, 5 obtendrán 5, pero 5 no es una respuesta que satisfaga los requisitos.
En este momento, simplemente devuelva el número obtenido a la matriz y verifíquelo nuevamente para ver si el número cumple con los requisitos.
La complejidad de tiempo de todo el algoritmo es o (n)

Código

public int MoreThanHalfNum_Solution(int [] array) {
        if(array == null || array.length == 0){
            return 0;
        }
        int count = 0;
        int num = -1;//-1 不指向任何数
        for (int i = 0; i < array.length; i++) {
            if(array[i] == num){
                count++;
            } else if(num == -1){ //重新指向一个
                num = array[i];
                count++;
            } else{
                count--;
                if(count == 0){ //消除指向
                    num = -1;
                }
            }
        }
        if(count == 0) { //count == 0,一定没有满足要求的
            return 0;
        } else { //可能有,需要对num精确检查
            int numCount = 0;
            for (int i : array) {
                if(i == num)
                    numCount++;
            }
            if(numCount > array.length/2)
                return num;
            else
                return 0;
        }
    }

Supongo que te gusta

Origin blog.csdn.net/Baibair/article/details/108564642
Recomendado
Clasificación