第一种,自然而然的想法:
class Solution {
public int countPrimes(int n) {
int i=2,j=2,count=0;
int flag=1;
for(;i<n;i++){
while(j<=Math.sqrt(i)){
if(i%j==0) {
flag=0;
break;
}
else j++;
}
if(flag==1) {
count++;
}
flag=1;
j=2;
}
return count;
}
}
可以估计时间复杂度为logn*n,这种解法会超出时间限制。
第二种:素数筛选法,抄的~~~
class Solution {
public int countPrimes(int n) {
boolean isPrime[]=new boolean[n];
for(int i=0;i<n;i++){
isPrime[i]=true;
}
for(int i=2;i*i<=n;i++){
if(isPrime[i]==false)continue;
for(int j=2;j*i<n;j++){
isPrime[i*j]=false;
}
}
int ans=0;
for(int i=2;i<n;i++){
if(isPrime[i]==true)ans++;
}
return ans;
}
}
时间复杂度O(n)
综合对比二者,对于150000这样的数时,第一种解法520ms左右,第二种解法20ms不到。