python实现不重复排列组合_怎么样让python计算任意六位数的排列组合?

求三位数组合

lst=[3,6,2,7]

这四个数字能组成多少个互不相同且无重复数字的三位数?比如362算一个,326算一个,请逐个输出他们

思路分析

从4个数里面取3个数,且不重复,然后进行拼接,做3个for循环加判断不相等即可。

与排列组合相同,取三个数,不放回,并且有顺序。

C

4

3

P

3

3

=

4

3

!

=

24

C_4^3*P^3_3=4*3!=24

C43∗P33=4∗3!=24种取法可能。(题目特殊,lst各不相同,若有相同需要先在重复中二选一

C

2

1

C_2^1

C21,但对于结果输出不影响,只是增加取法可能)

示例代码

lst=[3,6,2,7]

foriinlst:

forjinlst:

forkinlst:

ifi!=jandj!=kandk!=i:

print(int(str(i)+str(j)+str(k))

判断方式还可以是:

ifinotin(j,k)andj!=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]

forainlst:

tmp=lst.copy()

tmp.remove(a)

forbintmp:

tmp2=tmp.copy()

tmp2.remove(b)

forcintmp2:

print(a*100+b*10+c)

这样子反而空间复杂度增加了,语句变得冗余。

    原文作者:weixin_39997310
    原文地址: https://blog.csdn.net/weixin_39997310/article/details/110126195
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞