Description:
Count the number of prime numbers less than a non-negative number, n.
Example:
Input: 10
Output: 4
Explanation: There are 4 prime numbers less than 10, they are 2, 3, 5, 7.
题意:给定一个正整数,统计所有小于这个数的素数的个数;
解法一(超时):最简单的办法就是遍历所有小于这个数的元素,计算是否为素数后统计即可;但是,其时间复杂度为O(n1.5);
Java
class Solution {
public int countPrimes(int n) {
int cnt = 0;
for (int i = 2; i < n; i++) {
cnt = isPrime(i) ? cnt + 1 : cnt;
}
return cnt;
}
private boolean isPrime(int n) {
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) return false;
}
return n == 1 ? false : true;
}
}
解法二:参考Sieve of Eratosthenes知道,假如已经判断了2为素数,那么所有2的倍数都不是素数,3为素数,所有3的倍数都不是素数,4不是素数,4的所有倍数也都不是素数…依次可统计素数个数;
Java
class Solution {
public int countPrimes(int n) {
int cnt = 0;
boolean[] table = new boolean[n];
for (int i = 2; i < n; i++) {
if (!table[i]) {
cnt = isPrime(i) ? cnt + 1 : cnt;
for (int j = 2; j * i < n; j++) table[j * i] = true;
}
}
return cnt;
}
private boolean isPrime(int n) {
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) return false;
}
return n == 1 ? false : true;
}
}