Leetcode做题日记:47. 全排列 II(PYTHON)

给定一个可包含重复数字的序列,返回所有不重复的全排列。

示例:

输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]

第一次就通过,不过。。。1268ms,排名11.5%
和上一题代码几乎一模一样,只多了一个判断:

if len(x)==0 and ans1 not in ans2: 

感觉和不重复的全排列一模一样,只是这题有重复数字,加上这一条判断,就能去掉重复的,不过效率较低。

	def qplI(x,ans1,ans2):
            if len(x)==0 and ans1 not in ans2 : 
#因为使用一个数字,就会删除,那么当删除完毕,就结束
#因为有重复数字,所以重复的不加入ans2
                ans2.append(ans1)
            else:
                for i in range(len(x)):
                    qplI(x[:i]+x[i+1:],ans1+[x[i]],ans2)
#在这里改变x=x[:i]+x[i+1:],删除i位置的数字,就不会有重复的了
#避免再筛选这个步骤,比如[1,2,3],先确定1,下次递归x=[2,3]                    
        a=[]    
        qplI(nums,[],a)
        return a

仔细发现,其实全排列个数,和不同数字的个数有关。
稍微优化一下,不递归重复数字
为什么还是能成功凑齐len(nums)个数字呢?
因为只是不递归,单个数字的递归还是会和两个[1,1]相组合
只是少递归几次有重复数字的部分
第二次的代码,408ms,排名32%

	def qplI(x,ans1,ans2):
            if len(x)==0 and ans1 not in ans2 : 
#因为使用一个数字,就会删除,那么当删除完毕,就结束
                ans2.append(ans1)
            else:
                for i in range(len(x)):
                    if i<len(x)-1 and x[i]==x[i+1]:
#多写了这一条判断,如果有重复,则i=i+1                    
                        continue
                    qplI(x[:i]+x[i+1:],ans1+[x[i]],ans2)
#在这里改变x=x[:i]+x[i+1:],删除i位置的数字,就不会有重复的了
#避免再筛选这个步骤,比如[1,2,3],先确定1,下次递归x=[2,3]                    
        a=[]    
        qplI(nums,[],a)
        return a

猜你喜欢

转载自blog.csdn.net/weixin_44033136/article/details/86437424