求三位數(shù)組合
lst = [3, 6, 2, 7]
這四個(gè)數(shù)字能組成多少個(gè)互不相同且無(wú)重復(fù)數(shù)字的三位數(shù)?比如362算一個(gè)鳖宾,326算一個(gè)吼砂,請(qǐng)逐個(gè)輸出他們
思路分析
從4個(gè)數(shù)里面取3個(gè)數(shù),且不重復(fù)鼎文,然后進(jìn)行拼接渔肩,做3個(gè)for循環(huán)加判斷不相等即可。
與排列組合相同拇惋,取三個(gè)數(shù)周偎,不放回,并且有順序撑帖。 種取法可能蓉坎。(題目特殊,lst各不相同磷仰,若有相同需要先在重復(fù)中二選一
袍嬉,但對(duì)于結(jié)果輸出不影響,只是增加取法可能)
示例代碼
lst = [3, 6, 2, 7]
for i in lst:
for j in lst:
for k in lst:
if i != j and j != k and k!=i:
print(int(str(i)+str(j)+str(k))
判斷方式還可以是:
if i not in (j,k) and j !=k:
分析時(shí)間復(fù)雜度
在時(shí)間復(fù)雜度上面 n = 4灶平,有3個(gè)for循環(huán)伺通。
第一個(gè)for循環(huán)中f(n)=n
第二個(gè)for循環(huán)中f(n)=n^2
第三個(gè)for循環(huán)中f(n)=n^3
該算法的為 n^3+n^2+n
推導(dǎo)大O階方法:
# 1、用常數(shù)1取代運(yùn)行時(shí)間中的所有加法常數(shù)
n^3 + n^2 + 1
# 2逢享、在修改后的運(yùn)行次數(shù)函數(shù)中罐监,只保留最高階項(xiàng)
n^3
# 3、如果最高階項(xiàng)存在且不是1瞒爬,則去除與這個(gè)項(xiàng)相乘的常數(shù)
n^3
故最終時(shí)間復(fù)雜度O(n) = n^3
優(yōu)化思考
第二個(gè)for循環(huán)和第三個(gè)for循環(huán)弓柱,最終要取的數(shù)據(jù)都是與第一個(gè)for循環(huán)取得不同,那么我們?cè)谘h(huán)過程中直接建立取數(shù)方法侧但。比如第1位數(shù)被取了之后矢空,第二個(gè)for循環(huán)只用從剩下的數(shù)據(jù)當(dāng)中取數(shù)即可。
代碼示例
lst = [3, 6, 2, 7]
for a in lst:
tmp = lst.copy()
tmp.remove(a)
for b in tmp:
tmp2 = tmp.copy()
tmp2.remove(b)
for c in tmp2:
print(a*100 + b*10 + c)
這樣子反而空間復(fù)雜度增加了禀横,語(yǔ)句變得冗余屁药。