###46. Permutations 题目: 难度: Medium 复习了一下,自己写的容易理解版本: 每次调一个放入现有 ``` class Solution(object): def permute(self, nums): """ :type nums: List[int] :rtype: List[List[int]] """ self.result = [] self.recPermute([],nums) return self.result def recPermute(self, sofar, rest): if rest == []: self.result.append(sofar) else: for i in range(len(rest)): next = sofar + [rest[i]] remaining = rest[:i] + rest[i+1:] self.recPermute(next, remaining) ``` 交换 ``` class Solution(object): def permute(self, nums): """ :type nums: List[int] :rtype: List[List[int]] """ result = [] self.helper(nums,0,result) return result def helper(self,nums,begin,result): n = len(nums) if begin == n: tmp = nums[:] result.append(tmp) return for i in range(begin,n): nums[begin], nums[i] = nums[i],nums[begin] self.helper(nums,begin+1,result) nums[begin],nums[i] = nums[i],nums[begin] ``` 好像还有一个巧妙的版本 ``` class Solution: # @param num, a list of integer # @return a list of lists of integers def permute(self, num): if len(num) == 0: return [] if len(num) == 1: return [num] res = [] for i in range(len(num)): for j in self.permute(num[:i] + num[i+1:]): res.append([num[i]] + j) return res ``` 更容易理解的写法: ``` class Solution: # @param num, a list of integer # @return a list of lists of integers def permute(self, num): if len(num) == 0: return [] if len(num) == 1: return [num] res = [] for i in range(len(num)): x = num[i] xs = num[:i] + num[i+1:] for j in self.permute(xs): res.append([x] + j) return res ``` 就是一定要有递归的信念❤️ 还有介绍的基本无memory使用的算法: ``` class Solution: # @param num, a list of integer # @return a list of lists of integers def permute(self, num): if len(num) == 0: yield [] if len(num) == 1: yield [num] res = [] for i in range(len(num)): x = num[i] xs = num[:i] + num[i+1:] for j in self.permute(xs): res.append([x] + j) yield res ``` 但是这个yield只是生产generator,要看结果还是要用for in的。