* 统计所有小于非负整数 n 的质数的数量。
*
* 示例:
*
* 输入: 10
* 输出: 4
* 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
解题思路:
不能想当然采用一个一个的去处理,否则时间复杂度为O(n^2)。
首先从 2 开始,我们知道 2 是一个质数,那么 2 × 2 = 4, 3 × 2 = 6, 4 × 2 = 8... 都不可能是质数了。
然后我们发现 3 也是质数,那么 3 × 2 = 6, 3 × 3 = 9, 3 × 4 = 12... 也都不可能是质数了。
所以利用boolean[]来标记质数,如果是质数则标记其倍数为非质数,最后标记剩下的数就是质数。
class Solution {
public int countPrimes(int n) {
int res = 0;
//如果大于2,则一定拥有2这个质数
if(n > 2)
res++;
boolean[] b = new boolean[n];//初始化默认为false,为质数标记
for(int i=3; i<n; i=i+2){
if(!b[i]){
for(int j=2; i*j<n; j++)
b[i*j] = true; //将当前质数的整数倍都设置为非质数标记 true
res++;
}
}
return res;
}
}
|