题目 46 Permutations I
Given a collection of distinct integers, return all possible permutations.
Example:
Input: [1,2,3]
Output:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
思路
对于n个数,相当于先对前 n-1 个数排列,然后再把最后这个数插入到不同的位置
def permute(self, nums: List[int]) -> List[List[int]]:
if len(nums) == 0:
return []
elif len(nums) == 1:
return [[nums[0]]]
ans = []
temp = self.permute(nums[1:])
for item in temp:
for i in range(len(item)+1):
p = item.copy()
p.insert(i,nums[0])
ans.append(p)
return ans
题目 47 Permutations II
Given a collection of numbers that might contain duplicates, return all possible unique permutations.
Example:
Input: [1,1,2] Output: [ [1,1,2], [1,2,1], [2,1,1] ]
思路
同样也是递归插入,不过在对每一项插入新数字时,如果遇到了与插入数字相同的数字,就可以终止了。因为对后面的空位而言,在上一次插入该数字时已经考虑过了,并列在了当前项中。
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
if len(nums) == 0:
return []
elif len(nums) == 1:
return [[nums[0]]]
nums.sort()
ans = []
temp = self.permuteUnique(nums[1:])
for item in temp:
for i in range(len(item)+1):
p = item.copy()
p.insert(i,nums[0])
ans.append(p)
if i<len(item):
if nums[0] == item[i]:
break
return ans