[LeetCode]204. 计数质数

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

厄拉多塞筛法

最常见的判断n是否是质数的思路就是逐个遍历2~n^0.5之间的数能否被n整除, 若能整除则不是质数, 不能整除则是质数.
然而这个算法的时间复杂度是O(n^2), 当n特别大时肯定会超时, 在LeetCode中提交不会通过.
这时该用到厄拉多塞筛法, 实现步骤: 从2开始遍历到根号n,先找到第一个质数2,然后将其所有的倍数全部标记出来,然后到下一个质数3,标记其所有倍数,一次类推,直到根号n,此时数组中未被标记的数字就是质数。我们需要一个n-1长度的bool型数组来记录每个数字是否被标记,长度为n-1的原因是题目说是小于n的质数个数,并不包括n。

Sieve_of_Eratosthenes_animation.gif

示例代码:

class Solution(object):
  def countPrime(n):
      if n < 3:
          return 0
      prime = [1] * n
      prime[0] = prime[1] = 0
      for i in range(2, int(n**0.5) +1):
          if prime[i] == 1:
              prime[i*i:n:i] = [0]*len(prime[i*i:n:i])
      return sum(prime)
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这道题目对时间复杂度要求比较高。先将n个数放入表中,将所有数标记为true。从2开始访问,此时2为true,质数计...
    alexsssu阅读 1,215评论 0 0
  • 网上写 RSA 算法原理的文章不少,但是基本上要么忽略了数学原理的说明,要么缺少实际的可运行的例子,为此特写了此文...
    __七把刀__阅读 21,047评论 14 29
  • 解法一: 这道题可以用埃拉托斯特尼筛法 Sieve of Eratosthenes,这个算法的过程如下图所示,我们...
    Little丶Jerry阅读 4,055评论 0 0
  • 问题: Count the number of prime numbers less than a non-neg...
    Cloudox_阅读 2,586评论 0 0
  • 统计所有小于非负整数 n 的质数的数量。 示例: 思路 这道题给定一个非负数n,让我们求小于n的质数的个数,题目中...
    尼小摩阅读 4,464评论 0 1