算法(TS):计数质数

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

示例 1:

输入:n = 10

输出:4

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

示例 2:

输入:n = 0

输出:0

示例 3:

输入:n = 1

输出:0

提示:

  • 0 <= n <= 5 * 106

解法一:枚举求解

考虑质数的定义:在大于 1 的自然数中,除了 1 和它本身以外不再有其他因数的自然数。因此对于任何整数n,我们都能从小到大枚举[2,n-1]中的 x,判断 x 是否能被 n 整除,如果能,则n是质数。这里的时间复杂度为O(n)。继续考虑,如果 x 能被 n 整除,那么 n/x 也能被 n 整除,因此只需要校验 x 或者 n/x 就能判断 n 是不是质数。Math.min(n/x,x)一定落在[2,Math.sqrt(x)] 的区间中,因此对于整数 n,只需要判断[2,Math.sqrt(x)]是否有因子即可。这样单次检测的事件复杂度从O(n)减低到O(Math.sqrt(n))。

返回所有小于非负整数 n 的质数的数量,只需要判断从 2 到 n-1 的数是否是质数。

typescript 复制代码
function isPrime(n:number) {
    for(let i = 2; i * i <= n; i++) {
        if(n%i===0) {
            return false
        }
    }

    return true
}

function countPrimes(n: number): number {
    let count = 0

    for(let i = 2; i < n; i++) {
        if(isPrime(i)){
            count++
        }
    }

    return count
}

解法二:埃氏筛

如果 x 是质数,那么 x 的 j 倍,例如 2x,3x... 一定不是质数,利用可以从这里入手优化时间复杂度。

ini 复制代码
function countPrimes(n: number): number {
    const isPrimeArr = new Array(n).fill(1)
    let count = 0

    for(let i = 2; i < n; i++) {
        if(isPrimeArr[i]) {
            count++
            for(let j = 2;i * j < n;j++) {
                isPrimeArr[i * j] = 0
            }
        }
    }

    return count
}

时间复杂度:O(nlog⁡log⁡n),空间复杂度:O(n)。

相关推荐
陈天伟教授17 分钟前
人工智能应用- 材料微观:04.微观结构:金属疲劳
人工智能·神经网络·算法·机器学习·推荐算法
样例过了就是过了18 分钟前
LeetCode热题100 螺旋矩阵
算法·leetcode·矩阵
敲代码的哈吉蜂21 分钟前
haproxy的算法——动态算法
算法
追随者永远是胜利者22 分钟前
(LeetCode-Hot100)226. 翻转二叉树
java·算法·leetcode·职场和发展·go
yyjtx23 分钟前
DHU上机打卡D27
c++·算法·图论
漂流瓶jz36 分钟前
UVA-12569 树上的机器人规划(简单版) 题解答案代码 算法竞赛入门经典第二版
算法·图论·dfs·bfs·uva·算法竞赛入门经典第二版·11214
hwtwhy41 分钟前
【情人节特辑】C 语言实现浪漫心形粒子动画(EasyX 图形库)
c语言·开发语言·c++·学习·算法
云淡风轻~窗明几净43 分钟前
割圆术求Pi值的重新验证
数据结构·算法
陈天伟教授1 小时前
人工智能应用- 材料微观:01. 微观结构的重要性
人工智能·神经网络·算法·机器学习·推荐算法
ValhallaCoder1 小时前
hot100-贪心
数据结构·python·算法·贪心算法