统计所有小于非负整数 n 的质数的数量。
示例 1:
输入:n = 10
输出:4
解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
示例 2:
输入:n = 0
输出:0
示例 3:
输入:n = 1
输出:0
我的解法:枚举(时间复杂度最差情况下会到 O(n),无法通过所有测试数据。)
class Solution:
def countPrimes(self, n: int) -> int:
count = 0
countj = 0
if n <= 1:
return 0
else:
for i in range(2,n):
for j in range(2,i):
if i % j == 0:
break
else:
count += 1
return count
官方解法:https://leetcode-cn.com/problems/count-primes/solution/ji-shu-zhi-shu-by-leetcode-solution/
解法一:改进的枚举(但还是超出时间限制。。。麻了)
class Solution:
def countPrimes(self, n: int) -> int:
def isPrime(n):
i = 2
while i*i <=n:
if n % i == 0:
return 0
i += 1
else:
return 1
count = 0
for i in range(2, n):
count += isPrime(i)
return count
解法二:埃氏筛(埃氏筛的定义:要得到自然数 n 以内的全部质数,必须把不大于 根号n 的所有质数的倍数剔除,剩下的就是质数。)
def count_primes_py(n):
"""
求n以内的所有质数个数(纯python代码)
"""
# 最小的质数是 2
if n < 2:
return 0
isPrime = [1] * n
isPrime[0] = isPrime[1] = 0 # 0和1不是质数,先排除掉
# 埃式筛,把不大于根号 n 的所有质数的倍数剔除
for i in range(2, int(n ** 0.5) + 1):
if isPrime[i]:
isPrime[i * i:n:i] = [0] * ((n - 1 - i * i) // i + 1)
# 指定步长参数,进行列表切片赋值,之所以从 i 的平方开始,是因为小于 i 的平方的倍数部分,在它之前就已经被排除掉了。
return sum(isPrime)
python质数判断:https://www.runoob.com/python3/python3-prime-number.html
力扣 (LeetCode)链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnzlu6/