leetcode46.全排列 Python

题目:

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

思路:

回溯法

用递归实现回溯,创建一个数值集合来存放遍历过的数,调用递归函数进行递归,传入数组,空路径,结果列表,遍历过的数的集合,当路径长度等于数组长度时,将路径添加进结果列表里。

注意,注意,往结果列表里放的是路径的复制品,不是路径本身,因为在后续的递归操作中,会对路径处理,并且最终路径会是空,如果直接在结果列表中加入路径,那最后输出的就都是空了。

遍历数组中的数,当没有遍历过时,加进visited集合,加进路径,然后继续递归,往路径中加后面的元素,当路径长度为数组长度时,返回,需要回到原来的状态,即弹出路径中的最后一个元素,去掉集合中上一次遍历的数,然后循环遍历下一个元素。

class Solution(object):
    def permute(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        res = []
        visited = set([]) # 创建一个数值集合
        def dfs(nums,path,res,visited):
            if len(path) == len(nums):
                res.append(path[:])
                return 
            for num in nums:
                if num not in visited:
                    visited.add(num)
                    path.append(num)
                    dfs(nums,path,res,visited)
                    path.pop()
                    visited.discard(num)
        dfs(nums,[],res,visited)
        return res

你可能感兴趣的:(leetcode,python,leetcode,回溯)