題目連結:Counting Primes
思路:
首先要知道如何判斷一個數字是否為素數。具體方法可以看這裡
其次,如果樸素的判斷,那麼會因為效率底下而超時。
所以在我們每次找到素數的時候,可以把素數的倍數都標記為非素數。這樣可以節省輪詢的時間。
演算法複雜度:
時間:O(nloglogn) (time complexity for Sieve of Eratosthenes Algorithm)
空間:O(n)
程式碼:
class Solution(object):
def countPrimes(self, n):
"""
:type n: int
:rtype: int
"""
if n < 3:
return 0
primes = [True] * n
primes[0] = primes[1] = False
for i in range(2, int(n**0.5)+1):
if primes[i]:
for j in range(i*i, n, i):
primes[j] = False
return sum(primes)