204. Count Primes

Solution

需要知道prime的倍數一定不是prime,所以建立boolean array紀錄每個數字是否為Prime,當一旦認定他為prime (ture),那其倍數必定為false。

另外只需判斷到sqrt(n)就可以推論出0~n所有數是否為質數的狀態( 這是數學理論) 可以進一步減少運算。

TimeComplexity : O(n) * O(1/2 + 1/3 + 1/5 + .... 1/LastPrime) = O(nloglog(n)) with sqr(n) optimized : O(sqrt(n)*loglog(n))

 public int countPrimes(int n) {
        if( n <= 1) return 0;
        boolean[] isPrime = new boolean[n];
        Arrays.fill(isPrime, true);
        isPrime[0] = false;
        isPrime[1] = false;
        for(int i = 2; i <= (int)Math.sqrt(n); i++){ // O(sqrt(n))
            if(isPrime[i]){
                for(int j = 2; j*i < n; j++){ //O(n/2 + n/3 + n/5 + ... +n/lastPrime) 
                    isPrime[j*i] = false;
                }
            }
        }
        int count = 0;
        for(boolean p : isPrime){
            if(p) count++;
        }
        return count;
    }

Last updated

Was this helpful?