LeetCode-计数质数

简介: LeetCode-计数质数

🔎概述

给定整数 n ,返回所有小于非负整数 n 的质数的数量


🔎题解


🌻解法1(朴素解法)

public int countPrimes(int n) {
        int count = 0;
        for (int i = 2; i < n; i++) {
            if(isPrime3(i))
                count++;
        }
        return count;
}
private boolean isPrime(int num) {
        for (int i = 2; i <= Math.sqrt(num); i++) {
            if(num % i == 0) return false;
        }
        return true;
}
  • 对于一个正整数9,我们只需要判断9对于2-9的平方根的数字取余是否为0,即可判断该数是否为质数
  • 对于质数,是指该数是否能仅被1和它本身整除,所以从2开始
  • 为什么是9的平方根,因为任何一个数都不可能分解成两个大于其平方根的数的乘积.肯定只能分解为一个大于或等于其平方根,另一个小于或等于其平方根.

显然,这种方法是不够高效的

下面介绍一种更为高效的方法


🌻解法2(埃氏筛)

public int countPrimes(int n) {
        int count = 0;//统计有多少个质数
        boolean[] notPrime = new boolean[n];//0~n-1
        for (int i = 2; i < n; i++) {
            if(notPrime[i]) {//如果不是质数,继续
                continue;
            }
            count++;//是质数,个数+1
            //这里用long因为题目给的数据范围是10^6,过大
            //从2开始,j = i * i,即为i的最小倍数,那么i的倍数一定不是质数
            //j += i,表示在i的最小倍数再加上i
            //j = 4,j += i(j = 6,8,10...),这些数字均不是质数
            for (long j = (long)i * i; j < n; j += i) {
                notPrime[(int)j] = true;
            }
        }
        return count;
}
  • 埃氏筛
  • 从最小的质数开始,它的倍数均不是质数(从2开始,4,6,8,10…均不是质数),将notPrime[j]标记位true
  • 剩下的最小数字就是3,再将3的倍数依次标记为true(9,15)
  • 重复上述步骤,直到遍历结束
  • 剩下的未被标记的数字即为质数


🔎题目链接

204. 计数质数


🔎结尾

如果大家有什么不太理解的,可以私信或者评论区留言,一起加油

相关文章
【Leetcode -696.计数二进制字串 -697.数组的度】
【Leetcode -696.计数二进制字串 -697.数组的度】
38 0
【Leetcode -748.最短补全词 -762.二进制表示中质数个计算置位】
【Leetcode -748.最短补全词 -762.二进制表示中质数个计算置位】
52 0
【Leetcode -292.Nim游戏 -326. 3的幂 -338.比特位计数】
【Leetcode -292.Nim游戏 -326. 3的幂 -338.比特位计数】
41 0
|
7月前
|
JavaScript
【leetcode】204--计数质数-暴力-&-埃拉托斯特尼法
【leetcode】204--计数质数-暴力-&-埃拉托斯特尼法
30 0
|
7月前
|
JavaScript
【leetcode】204. 计数质数 暴力 & 埃拉托斯特尼法
【leetcode】204. 计数质数 暴力 & 埃拉托斯特尼法
40 0
|
7月前
LeetCode题 338比特位计数,20有效的括号,415字符串相加
LeetCode题 338比特位计数,20有效的括号,415字符串相加
70 0
|
7月前
|
机器学习/深度学习 算法 vr&ar
☆打卡算法☆LeetCode 204. 计数质数 算法解析
☆打卡算法☆LeetCode 204. 计数质数 算法解析
|
7月前
leetcode-338:比特位计数
leetcode-338:比特位计数
39 0
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
4月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
124 2