ML
算法題
- 用雙指針法求解nSum問題
- 線性篩法: 時間為
O(n)。
flags = [True] * (n + 1)
primes = []
pnum = 0
for i in range(2, n):
if flags[i]:
pnum += 1
primes.append(i)
for j in range(pnum):
ind = primes[j] * i
if ind > n:
break
flags[ind] = False
if i % primes[j] == 0:
break
任意一個合數(shù)均可以表示為素數(shù)的乘積,線性篩法確保一個合數(shù)由其最小的因子來消除,這樣可以確保其只被標記一遍。上述代碼中,一個數(shù)
k表示為, 由于
primes數(shù)組是有序的,故可以確保k是被其最小因子消除的;當i有一個因子為primes[j]時,就不能繼續(xù)標記了,因為primes中接下來的質(zhì)數(shù)肯定比i的因子大,就不符合標記準則了。比如k=90, primes[j]=3, i = 2 * 3 * 5 = 30時就不標記,直到在primes[j]=2, i = 3 * 3 * 5 = 45,這樣就解決了重復標記的問題;
時間復雜度分析:因為避免了重復標記問題,所以標記操作總共為O(n),單次循環(huán)平均為O(1);外層循環(huán)復雜度為O(n)。所以總體復雜度為O(n);
Eratosthenes篩法(埃式篩法)時間復雜度分析
調(diào)和級數(shù)
調(diào)和級數(shù)部分和