统计所有小于非负整数 n 的质数的数量。

示例:

输入: 10
输出: 4
解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。

思路:
如果一个数是质数那么它的倍数一定不是质数
从2开始,2是质数,那么 4 8 10…都不是质数
再从3开始 3是质数,那么 6 9 12…都不是质数

如果这样的话我们可以创建个数组长度为N+1,主要是为了第一个数为1开始,那么从2开始,标记不为质数的情况,然后索引+1判断当前是否是质数,如果不是继续+1
如果是,那么同2一样标记所有其倍数的情况。

class Solution {
    public int countPrimes(int n) {
       boolean[] flag = new boolean[n+1];
        for(int i=0;i<flag.length;i++){
            flag[i] = true;
        }
        int i = 2;
        int count = 0;
        while(i<n){
            if(flag[i]) {
                for (int j = 2; j * i < n + 1; j++) {
                    flag[j * i] = false;
                }
                count++;
            }
            i++;
        }
        return count; 
    }
}

其实这里不需要初始化数组为true,因为可以后面判断if 加个!非判断。也不需要遍历到N,直接到sqrt(N)就行
整体上的算法思路就是这样,没有太大改变,上面的优化没有改变整体,所以知道就好,我也就没有去改代码了