一开始没有考虑这么多,就是通过遍历计算出是否为质数,思路简单,写了下面的程序,但是超出时间限制,时间复杂度过高,为O(n2)。
class Solution {
public int countPrimes(int n) {
int count = 0;
for (int i = 2; i < n; i ++) {
if (isPrimes(i))
count ++;
}
return count;
}
public boolean isPrimes(int num) {
for (int i = 2; i <= Math.sqrt(num); i ++) {
if (num % i == 0)
return false;
}
return true;
}
}
修改之后,时间复杂度没变,但是通过剔除质数倍数的方式,使得搜索时间大大缩短了。
class Solution {
public int countPrimes(int n) {
int count = 0;
boolean flag[] = new boolean[n];
for (int i = 2; i < n ; i ++) {
if (!flag[i]){
count ++;
for (int j = 1; j * i < n ; j ++)
flag[j * i] = true;
}
}
return count;
}
}