题目描述
Count the number of prime numbers less than a non-negative number, n.
思路
开辟一个辅助数组,依次标记 2−n√ 的所有倍数。最后遍历该数组,计数素数。
代码
class Solution(object):
def countPrimes(self, n):
"""
:type n: int
:rtype: int
"""
if n is None or n <= 1:
return 0
tmp = [True] * n
tmp[0] = False
tmp[1] = False
i = 2
while i * i < n:
if tmp[i]:
j = i
while j * i < n:
tmp[i * j] = False
j += 1
i += 1
res = 0
for k in tmp:
if k:
res += 1
return res
复杂度分析
时间复杂度 O(nlglgn) ,空间复杂度 O(n) 。
如何判断一个数是否为素数
- 法一
遍历 2 到(n−1) ,看是否有数字能整除 n 。时间复杂度O(n) 。 - 法二
遍历 2 到n√ ,看是否有数字能整除 n 。时间复杂度O(logn) 。 法三
大于等于5的素数一定和6的倍数相邻。
若 x≥1 , ...,6x−1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),... ,除 6x−1 和 6x+1 都一定不是素数(因为都能找到约数)。那么我们就可以以6为步长,只判断6的倍数左右两侧的数,加快速度。class Solution: """ @param: head: a ListNode @return: a ListNode """ def isPrime(self, n): if n is None or n < 2: return False if n == 2 or n == 3: return True if n % 6 != 1 and n % 6 != 5: return False i = 5 while i * i <= n: if n % i == 0 or n % (i + 2) == 0: return False i += 6 return True