题目:
分析:
求解这题如果选择常规的思路去遍历判断每个数是否为质数,即它只能被1和自身整除,时间会超,复杂度O(n^2)。为了优化时间,这题可以使用筛选的方法来实现质数的计算,具体实现是埃拉托斯特尼筛法。
埃拉托斯特尼筛法:
把大于等于2,小于根号n的那些数的整数倍删除,剩下的就是所要求的范围内的质数。先使用一个boolean的数组来保存每个值是否可取的信息,然后先筛去0和1,把它们赋值为true,然后从2开始把小于根号n的数的整数倍的值赋为true。最后统计所有值为false的个数并返回。
算法实现:
public class Solution {
public int countPrimes(int n) {
if(n<=1){
return 0;
}
boolean[] flag=new boolean[n];
flag[0]=true;
flag[1]=true;
for(int i=2;i*i<n;i++){
if(!flag[i]){
for(int j=2*i;j<n;j+=i){
flag[j]=true;
}
}
}
int sum=0;
for(boolean a:flag){
if(a==false){
sum++;
}
}
return sum;
}
}