132/300
- 计数质数
统计所有小于非负整数 n 的质数的数量。
示例:
输入: 10
输出: 4
解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
思路:厄拉多塞筛法
sieve of Eratosthenes:给素数的倍数灭灯
图源:wikimedia
Time complexity: O(nloglogn); Space complexity: O(n)
遍历不需要从 2 ~ N, 只需要从 2 ~
N
\sqrt{N}
N :
对于合数N =
N
×
N
\sqrt{N}\times\sqrt{N}
N×N = d1
×
\times
× d2
推出 d1 <=
N
\sqrt{N}
N or d2 <=
N
\sqrt{N}
N
举例:
119 = 7
×
\times
× 17 ;
119
\sqrt{119}
119 = 10.908
7的倍数, 119被灭
关于如何灭灯:需要用到Python 字符串/列表 切片slice的知识
class Solution:
def countPrimes(self, n: int) -> int:
if n < 3: return 0
res = [ 1 for _ in range(n) ]
res[0], res[1] = 0, 0
for i in range(2, int(n**0.5) + 1):
res[i*i::i] = len(res[i*i::i])*[0]
return sum(res)