LeetCode 46. Permutations
阿新 • • 發佈:2017-06-03
oss win col following lee ble ssi ont follow
原題
Given a collection of distinct numbers, return all possible permutations.
For example,
[1,2,3]
have the following permutations:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
解題思路
遞歸:遞歸的方法,創建一個visit判斷此值是否已經添加過,每一層不斷地循環,加入沒有被訪問的元素,直到最後結果的長度滿足要求加入答案中
class Solution(object): def permute(self, nums): """ :type nums: List[int] :rtype: List[List[int]] """ if nums == None: return [] visit = [0 for i in range(len(nums))] self.ret = [] self._permute(nums, visit, 0, []) return self.ret def _permute(self, nums, visit, count, ret): if count == len(nums): self.ret.append(ret) return for i in xrange(len(nums)): if visit[i] == 0: # ret += [nums[i]] 容易出錯,如果加入這句後面需要還原,不然影響後面的循環 visit[i] = 1 self._permute(nums, visit, count+1, ret+[nums[i]]) visit[i] = 0
非遞歸:跟之前求subsets的思路類似(不過這個是求重復項,sbusets是求非重復),也是從一個個元素一層層加上去,只不過加入結果的時候必須滿足長度要求
class Solution(object): def permute(self, nums): """ :type nums: List[int] :rtype: List[List[int]] """ if nums is None: return [] result = [] self.helper(nums, [], result) return result def helper(self, List, path, result): if len(path) == len(List): result.append(path) return # 跟subsets思路差不多,不過這個是重復,sbusets是非重復 # 也是從一個個元素一層層加上去,只不過加入結果的時候必須滿足長度要求 for i in range(len(List)): # 不重復加入同一元素 if List[i] in path: continue # path.append(List[i]) self.helper(List, path + [List[i]], result) # path.pop()
LeetCode 46. Permutations