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?