LeetCode 204. 计数质数
https://leetcode.cn/problems/count-primes/
枚举(超时)
时间复杂度: O ( n 3 / 2 ) O(n^{3/2}) O(n3/2)
class Solution:
def countPrimes(self, n: int) -> int:
## 时间复杂度 O(n^(3/2)), 该方法超时了
def isPrime(x: int) -> bool:
for i in range(2, int(sqrt(x)) + 1):
if x % i == 0:
return False
return True
ans = 0
for i in range(n):
ans += isPrime(i)
return ans
枚举优化(超时)
时间复杂度没变,排除除了 2 2 2 以外的双数。
class Solution:
def countPrimes(self, n: int) -> int:
def isPrime(x: int) -> bool:
for i in range(3, int(sqrt(x)) + 1, 2):
if x % i == 0:
return False
return True
ans = 0
for i in range(3, n, 2):
ans += isPrime(i)
return ans + 1 if n > 2 else ans
埃氏筛算法
初始化长度
O
(
n
)
O(n)
O(n) 的标记数组,表示这个数组是否为质数。数组初始化所有的数都是质数,然后从下标为 2
开始,每次将一个最小的质数的倍数的下标全部置为 False
。
最后计算标记数组从下标 2
开始共有多少个 True
,即为质数的数量。
时间复杂度: O ( n log log n ) O(n\log{\log{n}}) O(nloglogn)
class Solution:
def countPrimes(self, n: int) -> int:
isPrime = [True] * n
for i in range(2, int(sqrt(n)) + 1):
if isPrime[i]:
# for j in range(i * i, n, i):
# isPrime[j] = False
isPrime[i*i::i] = [0]*((n-i*i-1)//i + 1)
return sum(isPrime[2:])