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
- Permutations
- Permutations
- Permutations
- Permutations
- Permutations
- Permutations
- Permutations
- Permutations
- Permutations
- Permutations
- Permutations
- Permutations
- Permutations
- Permutations
- Permutations
- Permutations
- Permutations
- Permutations
- windows下安装zookeeper
- .FileDialog 详解
- 【腾讯TMQ】专治时间长 —5分钟测试Android覆盖安装
- 详解Android中App的启动界面Splash的编写方法
- IOS隐藏编辑框键盘的方法
- Permutations
- 154.leetcode Find Minimum in Rotated Sorted Array II(hard)[排序数组 重复元素 二分查找]
- 多线程顺序打印ABC的三种实现---join方法
- Handler的细节知识点,书本上可能不会体现
- cordova初学者
- UI Overview
- Leetcode题集——unique-path
- annotation processor debug in android studio
- hdoj-1846-Brave Game