给定一个没有重复数字的序列,返回其所有可能的全排列。
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
类似于N皇后的回溯思想,这里也使用回溯思想
基调件:如果数组只有一个元素,就添加这个元素
如果数组大于1,遍历数组,生成器添加 :nums[i] + f(减去nums[i]的数组)
class Solution(object):
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
def perm(nums):
for i in range(len(nums)):
if len(nums) <= 1:
yield nums
else:
for res in perm(nums[:i]+nums[i+1:]if i != len(nums)-1 else nums[:i]):
yield [nums[i]] + res
return list(perm(nums))
47.全排列II
给定一个可包含重复数字的序列,返回所有不重复的全排列。
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
思路与上一题相同:最后利用元组和集合进行去重
一定有更好的办法,继续学习。
class Solution(object):
def permuteUnique(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
def perm(nums):
for i in range(len(nums)):
if len(nums) <= 1:
yield (nums[0],)
else:
for res in perm(nums[:i]+nums[i+1:]if i != len(nums)-1 else nums[:i]):
yield (nums[i],) + res
return list(set(perm(nums)))