LeetCode——204. 计数质数

题目描述

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

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

示例2:
输入:n = 0
输出:0

示例3
输入:n = 1
输出:0

题解思路

计算质数,刚开始接触就学的算法,一开始做的就是循环算,再加上根号简化目标,现在无非是计算质数的个数,就可以写个count记录

按照常规的思路写来是没问题,不过有事超出时间限制,现在很多常规的思路都应该打破了,这里官方题解除了我们那个枚举的方法,又给了一个埃氏筛的方法

这里得提一下,虽然我们一开始想到的叫做枚举方法,但是评论区的一个方法才是真正的枚举方法,以前有道题总是有人列出所有的结果,面向结果编程

但是这次他给的范围0 <= n <= 5 * 10^6,你总不能都列出来吧,但是他根据每次的提示用例都给测出来了,我直呼好家伙,直接超过100%

言归正传,咱说一下埃氏筛方法,他的思路就是一个数就算是质数,但是他的倍数总不能是吧,他的倍数称为合数,那这样我们从头开始,每个数就开始加自己的倍数

这样遍历完之后,剩下那些标志出来的就是合数,就可以淘汰了,剩下的就是质数了,这里用一个数组存储1或者0来标志就行了,代码如下

正确代码

class Solution {
    public int countPrimes(int n) {
        int[] isPrime = new int[n];
        Arrays.fill(isPrime, 1);
        int count = 0;
        for (int i = 2; i < n; ++i) {
            if (isPrime[i] == 1) {
                count += 1;
            }
            //????
            if ((long)i * i < n) {
                for (int j = i * i; j < n; j += i){
                    isPrime[j] = 0;
                }
            }
        }
        return count;
    }
}

总结

代码中我注释了有一个有疑惑的地方,那里的long强转我不知道它的作用,不加的话会报错,因为后来的j + i会造成下标越界

难道是害怕超过int的范围?但是这里也没超过呀,其他的写法也都是加这个强转

如果有大牛路过希望可以顺手帮我解释一下,文章如果还有其他问题也希望可以评论一起学习,各自努力,你我最高处见
posted @ 2021-03-22 23:53  21岁还不是架构师  阅读(36)  评论(0编辑  收藏  举报