美文网首页
2019-05-21LeetCode 46.全排列

2019-05-21LeetCode 46.全排列

作者: mztkenan | 来源:发表于2019-05-21 20:32 被阅读0次

借鉴

     def permute(self, nums: List[int]) -> List[List[int]]:
         return [[n]+p for i,n in enumerate(nums) for p in self.permute(nums[:i]+nums[i+1:])] or [[]]
class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
        if not nums:return [[]]  # 这个是因为如果不特殊处理, self.permute(nums[:i]+nums[i+1:])为空的话res.append([n]+p)不处理
        res=[]
        for i,n in enumerate(nums):
            for p in self.permute(nums[:i]+nums[i+1:]):
                res.append([n]+p)
        return res or[[]]

上面的思路是递归的思路,
下面是采用回溯的思路,将结果作为参数传递下去

class Solution2:
    def permute(self, nums: List[int]) -> List[List[int]]:
        res=[]
        self.dfs(nums,[],res)
        return res

    def dfs(self,nums:List[int],path:List[int],res:List[List[int]]):
        if not nums:
            res.append(path)
        for i,n in enumerate(nums):
            self.dfs(nums[:i]+nums[i+1:],path+[n],res)

由于别的语言没有切片这么方便的操作,所以通过第一个元素与后面每一个元素进行交换,使得只要传递第一个元素后面的元素,即是替代了切片操作出去fixed的第一个元素。交换之后,除了第一个元素剩下的元素就是回溯法当前层的可选集了,但是元素不能再是字典序了。

class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
        res=[]
        self.dfs(nums,[],res)
        return res


    def dfs(self,nums,path:List[int],res):
        if not nums:res.append(path+[]);return # 千万注意这里append是一个引用
        for j,_ in enumerate(nums):
            # print(nums[0],nums[j])  # 整个流程思路没错的话,应该就是细节和语法问题,最后发现是由于j是一个复制,不是引用,不会改变原数组
            nums[0], nums[j]=nums[j],nums[0]
            path.append(nums[0])
            self.dfs(nums[1:],path,res)
            path.pop()
            nums[0], nums[j]=nums[j],nums[0]

1.res.append(l)是一个引用
2.for j in nums 是一个复制

相关文章

网友评论

      本文标题:2019-05-21LeetCode 46.全排列

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