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ù)由其最小的因子來消除,這樣可以確保其只被標(biāo)記一遍。上述代碼中,一個數(shù)
k
表示為, 由于
primes
數(shù)組是有序的,故可以確保k
是被其最小因子消除的;當(dāng)i
有一個因子為primes[j]
時,就不能繼續(xù)標(biāo)記了,因為primes
中接下來的質(zhì)數(shù)肯定比i
的因子大,就不符合標(biāo)記準(zhǔn)則了。比如k=90, primes[j]=3, i = 2 * 3 * 5 = 30
時就不標(biāo)記,直到在primes[j]=2, i = 3 * 3 * 5 = 45
,這樣就解決了重復(fù)標(biāo)記的問題;
時間復(fù)雜度分析:因為避免了重復(fù)標(biāo)記問題,所以標(biāo)記操作總共為O(n)
,單次循環(huán)平均為O(1);外層循環(huán)復(fù)雜度為O(n)。所以總體復(fù)雜度為O(n);
Eratosthenes篩法(埃式篩法)時間復(fù)雜度分析
調(diào)和級數(shù)
調(diào)和級數(shù)部分和