# LeetCode – Count Primes (Java)

Count the number of prime numbers less than a non-negative number, n

Java Solution 1

This solution exceeds time limit.

 public int countPrimes(int n) { n = n-1;   ArrayList primes = new ArrayList();   if(n<=1) return 0; if(n==2) return 1; if(n==3) return 2;   primes.add(2); primes.add(3);   for(int i=4; i<=n; i++){ boolean isPrime = true; for(int p: primes){ int m = i%p; if(m==0){ isPrime = false; break; } }   if(isPrime){ primes.add(i); } }   return primes.size(); }

Java Solution 2

This solution is the implementation of Sieve of Eratosthenes.

 public int countPrimes(int n) { if (n <= 2) return 0;   // init an array to track prime numbers boolean[] primes = new boolean[n]; for (int i = 2; i < n; i++) primes[i] = true;   for (int i = 2; i <= Math.sqrt(n - 1); i++) { // or for (int i = 2; i <= n-1; i++) { if (primes[i]) { for (int j = i + i; j < n; j += i) primes[j] = false; } }   int count = 0; for (int i = 2; i < n; i++) { if (primes[i]) count++; }   return count; }

### 2 thoughts on “LeetCode – Count Primes (Java)”

1. public int countPrimes(int n) {
if (n <= 2)
return 0;

// init an array to track prime numbers
boolean[] primes = new boolean[n];
for (int i = 2; i < n; i++)
primes[i] = true;

for (int i = 2; i <= Math.sqrt(n - 1); i++) {
// or for (int i = 2; i <= n-1; i++) {
if (primes[i]) {

// j=i*i not i+i
for (int j = i * i; j < n; j += i)
primes[j] = false;
}
}

int count = 0;
for (int i = 2; i < n; i++) {
if (primes[i])
count++;
}

return count;
}

2. We can avoid first and last for loop in above code. Refer below code,

public static void countPrimes()

{

int n = 20;

bool[] nums = new bool[n+1];

int nonPrimeCounter = 0;

for (int i = 2; i <= 7; i++)

{

if (nums[i] == false)

{

for (int j = i+i; j <= n; j = j + i)

{

if (j%i == 0)

{

if (nums[j] == false)

{

nums[j] = true;

nonPrimeCounter++;

}

}

}

}

}

int primCounter = n – nonPrimeCounter;

}