美文网首页
46. 全排列(medium)

46. 全排列(medium)

作者: genggejianyi | 来源:发表于2019-05-27 18:53 被阅读0次

    给定一个没有重复数字的序列,返回其所有可能的全排列。
    示例:
    输入: [1,2,3]
    输出:
    [
    [1,2,3],
    [1,3,2],
    [2,1,3],
    [2,3,1],
    [3,1,2],
    [3,2,1]
    ]

    • show the code:
        def permute(self, nums: List[int]) -> List[List[int]]:
            if not nums:
                return [[]]
            res = []
            for i,num in enumerate(nums):
                for p in self.permute(nums[:i]+nums[i+1:]):
                    res.append([num]+p)
            return res
    
    • 此题的关键是要理解全排列生成思想,即递归。
    • 我们要求一个数组全部排列的可能性,可以考虑将数组分为两部分:一部分是数组的第一个元素;另一部分是第一个元素以后的所有元素。关于第一个元素,我们可以拿后面的元素和它逐个交换,关于第二部分的元素,我们同样将其分为两部分:第一个数和之后的数。
    • 从上面容易看出这是典型的递归思路,在上述代码中,我们遍历数组中每一个元素,将每一个元素放在第一个位置后,再求剩余元素的全排列,这时剩余元素的全排列就可以用递归来解决了,剩余元素具体体现为nums[:i]+nums[i+1:]
    • 另外这里要注意递归出口,当nums为空时,需要返回一个二维空数组。
    • 可以将上述代码修改为列表表达式,一行就可以解决问题(这个代码也真是niubility,关键在那个or [[]]如果没有的话只会返回[]):
        def permute(self, nums: List[int]) -> List[List[int]]:
            return [[num]+p for i,num in enumerate(nums) for p in self.permute(nums[:i]+nums[i+1:])] or [[]]
    
    • 关于为什么要有or [[]]的原因,我大概试了一下[] or [[]] >>> [[]] 所以为了避免我们返回[]之后递归就中止了,我们需要设立一个base case即[[]]其实有点相当于第一种代码里的递归出口

    相关文章

      网友评论

          本文标题:46. 全排列(medium)

          本文链接:https://www.haomeiwen.com/subject/tklktctx.html