求三位数组合
lst = [3, 6, 2, 7]
这四个数字能组成多少个互不相同且无重复数字的三位数?比如362算一个,326算一个,请逐个输出他们
思路分析
从4个数里面取3个数,且不重复,然后进行拼接,做3个for循环加判断不相等即可。
与排列组合相同,取三个数,不放回,并且有顺序。 种取法可能。(题目特殊,lst各不相同,若有相同需要先在重复中二选一,但对于结果输出不影响,只是增加取法可能)
示例代码
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:
分析时间复杂度
在时间复杂度上面 n = 4,有3个for循环。
第一个for循环中f(n)=n
第二个for循环中f(n)=n^2
第三个for循环中f(n)=n^3
该算法的为 n^3+n^2+n
推导大O阶方法:
# 1、用常数1取代运行时间中的所有加法常数
n^3 + n^2 + 1
# 2、在修改后的运行次数函数中,只保留最高阶项
n^3
# 3、如果最高阶项存在且不是1,则去除与这个项相乘的常数
n^3
故最终时间复杂度O(n) = n^3
优化思考
第二个for循环和第三个for循环,最终要取的数据都是与第一个for循环取得不同,那么我们在循环过程中直接建立取数方法。比如第1位数被取了之后,第二个for循环只用从剩下的数据当中取数即可。
代码示例
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)
这样子反而空间复杂度增加了,语句变得冗余。
网友评论