Permutations

来源:互联网 发布:nginx日志在哪 编辑:程序博客网 时间:2024/05/18 17:58

leetcode第46题,元素的全排列,这是一个很典型的回溯问题,也是深搜的问题,网上大部分的解法也差不多,我这里参照网上思路使用了两种方法。

方法一:回溯

全排列这个问题很明显是回溯,但是怎么找状态空间是个问题。假设1234是初始的四个数字,如何产生全排列呢?可以把第一个数字1依次与之后的数字交换,会产生一组数字分别为1234、2134、3214、4321。注意,假设1与2交换,变为2134,这又是一个新的数字,可以在此基础上再次进行上述操作,不过这回是从第二个数字开始依次与后面的数字交换,因为再从第一个开始就会又出现1234了,这样2134又会出现2134、2314、2341.如此下去,每个数字都可以这样进行操作。递归的出口就是当进行到最后一个数字时,由于没有后面数字可以交换了,前面的数字交换情况也都有了,于是可以返回。

class Solution(object):    def permute(self, nums):        """        :type nums: List[int]        :rtype: List[List[int]]        """        import copy        def swap(l,a,b):            temp = l[a]            l[a] = l[b]            l[b] = temp        if nums == []:            return [[]]        ans = []        def dfs(perNum,start,end):            if (start == end):                print perNum                tmp = copy.deepcopy(perNum)                ans.append(tmp)            else:                for i in range(start,end+1):                    swap(perNum,i,start)                    dfs(perNum,start+1,end)                    swap(perNum,i,start)        dfs(nums,0,len(nums)-1)        return ans
这个方法速度会慢一些,而且我在输出结果的时候用了一个深拷贝,不知道为什么一直不能直接append,希望大神指正。

方法二:

这个方法充分利用了python列表的切片功能,属于暴力深搜。思路是依次选取数字,并把这个数字在原有的数组里抛掉,依次递归下去,知道所有数字都抛掉了,就可以返回结果了。

class Solution(object):    def permute(self, nums):        """        :type nums: List[int]        :rtype: List[List[int]]        """        ans = []        def dfs(nums,path,ans):            if not nums:                ans.append(path)            else:                for i in range(len(nums)):                    dfs(nums[:i]+nums[i+1:],path+[nums[i]],ans)        dfs(nums,[],ans)        return ans





0 0
原创粉丝点击