Count Primes
Description:
Count the number of prime numbers less than a non-negative number, n.
Credits:
Special thanks to @mithmatt for adding this problem and creating all test cases.
A naive approach, check each i smaller than n that is prime or not.
O(n^2), time limit exceeded.
class Solution {
public:
int countPrimes(int n) {
if(n <= 2) return 0;
int count = 0;
for(int i = 2; i < n; i++){
if(isPrime(i)){
count++;
}
}
return count;
}
bool isPrime(int n){
for(int i = 2; i <= n / 2; i++){
if(n % i == 0){
return false;
}
}
return true;
}
};
n log log n complexity. But I don’t know how to prove it.
class Solution {
public:
int countPrimes(int n) {
if(n <= 2) return 0;
bool map[n];
memset(map, true, sizeof(map));
map[0] = map[1] = false; // not a prime
for(int i = 2; i <= sqrt(n); i++){
if(map[i] == false) continue; // not a prime
for(int t = 2; t * i < n; t++){
map[t * i] = false; // not a prime
}
}
int count = 0;
for(int i = 2; i < n; i++){
if(map[i] == true) count++;
}
return count;
}
};