给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:
输入:nums = [1]
输出:[[1]]
code:
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
def backtrack(subArray,curArray):
if not subArray:
ans.append(curArray)
return
else:
for i in range(len(subArray)):
backtrack(subArray[:i]+subArray[i+1:],curArray+[subArray[i]])
ans=[]
backtrack(nums,[])
return ans
code:
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
def dfs(nums, path):
if not nums:
ans.append(path)
return
nums_copy = copy.deepcopy(nums)
for num in nums_copy:
nums.remove(num)
dfs(nums, path + [num])
nums.append(num)
ans =[]
dfs(nums,[])
return ans
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
示例 1:
输入:nums = [1,1,2]
输出:[[1,1,2], [1,2,1], [2,1,1]]
示例 2:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
最简单的思路是在 1.2 的代码中加一步判断 path 是否在 ans 中的操作,但判断一个列表是否在另一个列表中的时间复杂度很高,导致运行时间很长,在测试用例更多的情况下可能会超出时间限制。
code:
class Solution:
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
def backtrack(nums,path):
if not nums:
if path not in ans:
ans.append(path)
return
else:
for i in range(len(nums)):
backtrack(nums[:i]+nums[i+1:],path+[nums[i]])
ans=[]
backtrack(nums,[])
return ans
执行结果:
执行用时:736 ms, 在所有 Python3 提交中击败了 11.89% 的用户
内存消耗:16.4 MB, 在所有 Python3 提交中击败了 21.76% 的用户
code:
class Solution:
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
def dfs(nums, path):
if not nums:
ans.append(path)
return
temp = list(set(nums))
for num in temp:
nums.remove(num)
dfs(nums, path + [num])
nums.append(num)
ans=[]
dfs(nums,[])
return ans
执行结果:
执行用时:56 ms, 在所有 Python3 提交中击败了 47.70% 的用户
内存消耗:16.5 MB, 在所有 Python3 提交中击败了 20.45% 的用户