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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值