题目
给定一个不含重复数字的数组 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 = [0,1]
输出:[[0,1],[1,0]]
示例 3:
**输入:**nums = [1]
输出:[[1]]
思路
DFS版子题五分钟秒了,本质上是DFS状态转移+状态回溯+终止条件处理,对于这道题来说要考虑到每一次选一个数,需要有一个表来记录已经选过的数,每次选没选过的,并且DFS之后把状态回溯,选择重置为空,注意这里要用到List.copy,不然只是存了引用,并没有产生新的List就会出现问题,并且List.copy也只是浅拷贝这里要注意一下要在合适的时候进行copy。
代码
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
lenNums = len(nums)
numsTab = {}
for v in nums:
numsTab[v] = -1
ans = []
def DFS(cur):
if(len(cur) == lenNums):
ans.append(cur)
return
for i in range(0,lenNums):
if(numsTab[nums[i]] == -1):
numsTab[nums[i]] = 1
tempList = cur.copy()
tempList.append(nums[i])
DFS(tempList)
numsTab[nums[i]] = -1
DFS([])
return ans