Leetcode 204. 计数质数

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

 

示例 1:

输入:n = 10

输出:4

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

示例 2:

输入:n = 0

输出:0

示例 3:

输入:n = 1

输出:0

 

提示:

  • 0 <= n <= 5 * 106

**难度**: Easy

**标签**: 哈希表、 数学、


# -*- coding: utf-8 -*-
# @Author  : LG

"""
执行用时:104 ms, 在所有 Python3 提交中击败了95.17% 的用户
内存消耗:36.3 MB, 在所有 Python3 提交中击败了6.94% 的用户

解题思路:
    厄拉多塞筛法
    https://leetcode-cn.com/problems/count-primes/solution/pythonzui-you-jie-fa-mei-you-zhi-yi-liao-ba-by-bru/
"""
class Solution:
    def countPrimes(self, n: int) -> int:
        if n < 2:   # 1, 2 不存在质数
            return 0
        record = [1] * n    # 记录质数,record[i]=1 表示, i+1是质数
        record[0], record[1] = 0, 0  # 1, 2不是质数
        for i in range(2, int(n**0.5)+1):
            if record[i]:
                record[i*i:n:i] = [0]*((n-1-i*i)//i+1)  # 如果当前i是质数,则2*i, 3*i ... 均不是质数
        return sum(record)