版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21275321/article/details/83832912
题目:
Count the number of prime numbers less than a non-negative number,
n
.
Example:Input: 10 Output: 4 Explanation: There are 4 prime numbers less than 10, they are 2, 3, 5, 7.
解释:
还是用动态规划的方式做,比写函数开根号的节省时间。
python代码:
from math import sqrt
class Solution(object):
def countPrimes(self, n):
"""
:type n: int
:rtype: int
"""
if n<=2:
return 0
isPrime=[True]*n
isPrime[0]=isPrime[1]=False
# 在选择除数时候的一个小技巧.大于一半的数是不可能做除数的.可以节省时间
for i in xrange(2,int(n**0.5)+1):
if isPrime[i]==True:
'''
j=i*i
while j<n:
isPrime[j]=False
j+=i
'''
isPrime[i * i: n: i] = [False] * len(isPrime[i * i: n: i]) # 非常简洁的语句
return sum(isPrime)
c++代码:
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
int countPrimes(int n) {
vector<bool> isPrime(n,true);
isPrime[0]=false;
isPrime[1]=false;
for (int i=2;i<int(sqrt(n))+1;i++)
{
if(isPrime[i])
{
int j=i*i;
while (j<n)
{
isPrime[j]=false;
j+=i;
}
}
}
return count(isPrime.begin(),isPrime.end(),true);
}
};
总结:
也是再做的时候才发现j
需要遍历到i**2+1
就好了,这样写,时间变了原来的1/3,震惊。
python可以直接sum()
一个bool数组来求数组中的True
的个数,用python的切片实现赋值简直震惊,注意数组初始化为True
。
注意题目是less than n
,所以数组元素初始化为n