LeetCode练习——数学(计算质数)

统计所有小于非负整数 n 的质数的数量。
示例 1:
输入:n = 10
输出:4
解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
示例 2:
输入:n = 0
输出:0
示例 3:
输入:n = 1
输出:0

我的解法:枚举(时间复杂度最差情况下会到 O(n),无法通过所有测试数据。)

class Solution:
    def countPrimes(self, n: int) -> int:
        count = 0
        countj = 0
        if n <= 1:
            return 0
        else:
            for i in range(2,n):
                for j in range(2,i):
                    if i % j == 0:
                        break
                else:
                    count += 1
        return count

官方解法:https://leetcode-cn.com/problems/count-primes/solution/ji-shu-zhi-shu-by-leetcode-solution/
解法一:改进的枚举(但还是超出时间限制。。。麻了)

class Solution:
    def countPrimes(self, n: int) -> int:
        def isPrime(n):
            i = 2
            while i*i <=n:
                if n % i == 0:
                    return 0
                i += 1
            else:
                return 1

        count = 0
        for i in range(2, n):
            count += isPrime(i)
        return count

解法二:埃氏筛(埃氏筛的定义:要得到自然数 n 以内的全部质数,必须把不大于 根号n 的所有质数的倍数剔除,剩下的就是质数。)

def count_primes_py(n):
    """
    求n以内的所有质数个数(纯python代码)
    """
    # 最小的质数是 2
    if n < 2:
        return 0

    isPrime = [1] * n
    isPrime[0] = isPrime[1] = 0   # 0和1不是质数,先排除掉

    # 埃式筛,把不大于根号 n 的所有质数的倍数剔除
    for i in range(2, int(n ** 0.5) + 1):
        if isPrime[i]:
            isPrime[i * i:n:i] = [0] * ((n - 1 - i * i) // i + 1)
			# 指定步长参数,进行列表切片赋值,之所以从 i 的平方开始,是因为小于 i 的平方的倍数部分,在它之前就已经被排除掉了。
    return sum(isPrime)

python质数判断:https://www.runoob.com/python3/python3-prime-number.html

力扣 (LeetCode)链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnzlu6/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值