(Java) Primes Count leetcode-204

【】统计质数
contar el número de números primos menos que un número no negativo, n.

Ejemplo:

Entrada: 10
Salida: 4
Explicación: Hay 4 números primos menos de 10, son 2, 3, 5, 7.

pensamiento

El establecimiento de una primera matriz notPrime Boolean, para marcar cada número dentro del rango de n es primo, un número primo si lo es, debe ser etiquetado como falsa, el número no prime está marcado como verdadero.
Inicialmente, todas las banderas son falsas.
El bucle exterior: desplazamiento i de 2 a n, si se encuentra número primo (marcado como falso), el recuento ++.
El bucle interior: el bucle externo son múltiplos de i para todo listo para cierto.
Después del ciclo de todos los números están marcados como verdadero no protónico. serán contados Todos los números primos.

código

public class Solution {
    public int countPrimes(int n) {
        boolean[] notPrime = new boolean[n];//初始为false
        int count = 0;
        for (int i = 2; i < n; i++) {
            if (notPrime[i] == false) {//false表示该数为质数
                count++;
                for (int j = 2; i*j < n; j++) {
                    notPrime[i*j] = true;//将i的所有倍数置为true,也就是非质数
                }
            }
        }
        
        return count;
    }
}

Presentar los resultados

Tiempo de ejecución: 12 ms, más rápido que el 80,90% de las presentaciones en línea de Java para el recuento de números primos.
Uso de memoria: 33,1 MB, menos de 100.00% de presentaciones en línea de Java para Primes Count.

mejorar

El código anterior se puede modificar para mejorar aún más la eficiencia.
Debido a que en el rango de n, sólo necesita detectar todo número impar, porque todos pares (excepto 2) no puede ser un número primo.
Podemos ver en los resultados, correr mucho más rápido.

código

public class Solution {
    public int countPrimes(int n) {
    	if (n < 3)
        	return 0;
        
        boolean[] notPrime = new boolean[n];
        int count = 0;
        for (int i = 3; i < n; i += 2) {//遍历所有的奇数
            if (notPrime[i] == false) {
                count++;
                for (int j = 3; i*j < n; j+=2) {//对其倍数(的标记)操作也只是操作所有的奇数
                    notPrime[i*j] = true;
                }
            }
        }
        
        return count+1;//没有把2算进去,所有+1
    }
}

Presentar los resultados

Duración: 7 ms, más rápido que el 98,28% de las presentaciones en línea de Java para el recuento de números primos.
Uso de memoria: 33,1 MB, menos de 100.00% de presentaciones en línea de Java para Primes Count.

Publicados 143 artículos originales · ganado elogios 45 · Vistas a 70000 +

Supongo que te gusta

Origin blog.csdn.net/z714405489/article/details/89556707
Recomendado
Clasificación