204. 计数质数
统计所有小于非负整数 n 的质数的数量。
示例 1:
输入:n = 10
输出:4
解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
示例 2:
输入:n = 0
输出:0
示例 3:
输入:n = 1
输出:0
提示:
0 <= n <= 5 * 106
class Solution {
public int countPrimes(int n) {
if(n<=2) return 0;
boolean[] flag = new boolean[n];
Arrays.fill(flag,true);
int res = 0;
for(int i=2;i<n;i++){
if(flag[i]==true){
res++;
if((long)i*i<n){
for(int j=i*i;j<n;j+=i){
flag[j]=false;
}
}
}
}
return res;
}
}
优化,对于一个质数i,如果按上文说的我们从2i 开始标记其实是冗余的,应该直接从ii开始标记,因为(i-1)i,(i-2)i,(i-3)i,(i-4)i,… 这些数一定在 ii之前就被(i-1)、(i-2)的倍数标记过了。
参考:https://leetcode-cn.com/problems/count-primes/solution/ji-shu-zhi-shu-by-leetcode-solution/
。