统计所有小于非负整数 n 的质数的数量。
示例:
输入: 10
输出: 4
解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
思路:
厄拉多塞筛法(Sieve of Eeatosthese)
代码1:
class Solution:
def countPrimes(self, n):
"""
:type n: int
:rtype: int
"""
if n<=2:
return 0
x=list(range(2,n))
for i in x:
j=2
while i*j<=n:
if i*j in x:
x.remove(i*j)
j+=1
return len(x)
分析1:
代码1 颇为易懂,但是在n值较大时无法满足其时间要求。
时间复杂度O(N^3),空间复杂度O(N)
代码2:
class Solution:
def countPrimes(self, n):
"""
:type n: int
:rtype: int
"""
if n<=2:
return 0
prime=[1]*n
prime[0]=prime[1]=0
for i in range(2,int(n**0.5) +1):
if prime[i]==1:
j=2
while i*j<n:
prime[i*j]=0
j+=1
return sum(prime)
分析2:
代码2优化数列为01数列,判断的是下标,标记的是值,并使用sum函数来返回质数数量。其次优化了循环次数,根据数学知识可得最大只需判断到n**0.5即可。
时间复杂度O(N),空间复杂度O(N)
参考:
厄拉多塞筛法(Sieve of Eeatosthese)https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes