【两次过】Leetcode 204: 计数质数

本文介绍了一种高效的算法,用于统计小于非负整数n的所有质数数量。通过标记法,避免了传统方法中时间复杂度过高的问题。示例显示,当输入为10时,输出正确地返回了4,即2、3、5、7这四个质数。

 * 统计所有小于非负整数 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;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值