解题思路:
我们只需要考虑高达√n的因数,因为如果n可被某个数p整除,则n = p×q,并且由于p≤q,我们可以得出p≤√n。
厄拉多塞筛法
如果当前数是p,我们总是可以标记出从p²开始标记的p的倍数,然后以p的增量标记:p² + p,p² + 2p,…
终止环路条件可以是p <√n
class Solution:
def countPrimes(self, n: int) -> int:
if n < 2: return 0
isPrimes = [1] * n
isPrimes[0] = isPrimes[1] = 0
for i in range(2, int(n ** 0.5) + 1):
if isPrimes[i] == 1:
isPrimes[i * i: n: i] = [0] * len(isPrimes[i * i: n: i])
return sum(isPrimes)