• 12-2:(47)全排列 II


    47. 全排列 II

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

    示例:

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

    A neat python solution:

    class Solution(object):
        def permuteUnique(self, nums):
            """
            :type nums: List[int]
            :rtype: List[List[int]]
            """
            ans = [[]]
            for n in nums: 
                ans = [p[:i]+[n]+p[i:]
                    for p in ans
                    for i in range((p+[n]).index(n)+1)]
            return ans
    

    分析

    (1)代码每次仅将nums中的一个数字抽出来(而且是按顺序抽出来),将它插入已经排列好的结果当中,从而形成由这个新加入的数字引发的新的排列。不妨让nums = [1, 1, 2],那么对每一轮外层 for 循环,ans 得到的结果如下所示:

    # 第1轮外层for循环:n = 1
    ans = [[1]]
    
    # 第2轮外层for循环:n = 1
    ans = [[1, 1]]
    
    # 第3轮外层for循环:n = 2
    ans = [[2, 1, 1], [1, 2, 1], [1, 1, 2]]
    

    (2)该代码的巧妙之处在于使用index避开了可能导致重复排列的情况:

    for i in range((p+[n]).index(n)+1)
    

    i 能取多少个值,就会导致多少中不同的排列情况,因为index返回的是 n 在 p + [n] 中的第一个位置,所以即便有再多重复的数字,对 i 的取值也不会造成任何影响,程序以此来避免重复排列的情况。

  • 相关阅读:
    filer jquery
    通过事件传参数
    spring 自动扫描bean
    springMvc
    jquery 自动完成
    webpack
    给数组对象中每个对象添加一个字段
    js对象的继承
    react项目中,点击跳转到详情页中,url中的地址有变化,但是页面没有进行跳转...
    ElementUI eltree 树形控件给节点添加图标
  • 原文地址:https://www.cnblogs.com/tbgatgb/p/11168656.html
Copyright © 2020-2023  润新知