204. Count Primes(python+cpp)
阿新 • • 發佈:2018-12-20
題目:
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