思路
res:存放所有排序
track表示一种排列
如:nums = [1,2,3] 其中一种排列:[1,3,2]
进行回溯
在进行回溯时因为传的是nums,所以要排除重复 如当前track[1] 则在遍历nums时,遇到1就可以跳过,不然就会有[1,1]情况 这显然不符合要求
len(track)==len(nums)时,代表找到一种排列,这时候track进行回退,去寻找下一个(拿组合来举例 如 nums=[1,2,3,4] 找出长度为3的组合 这时候找到一个组合 123 下一个 124 那就是之前的123 去掉3 把4加进来 )
如本题 123是一种 此时track回退 然后找下一个 132 这两个1是一样的 则pop两次后继续找到下一种排列
将track加入res时,需注意用res.append(track[:]),而不是res.append(track) 否则在执行track操作时,加入到res的对应数据也会跟着发生变动
class Solution(object):
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
res=[]
#存放一种结果
track=[]
def backtrack(nums,track):
if len(track)==len(nums):
'''
列表后面用[:]表示重新分配了内存给新的列表变量,这时两者的内存地址是不同的,
因此,改变其中的一个变量a 是不会影响到另一个变量b的
'''
res.append(track[:])
return
for i in nums:
if i in track:
continue
track.append(i)
backtrack(nums,track)
track.pop()
backtrack(nums,track)
return res
ps:
list[:]作用: https://blog.csdn.net/qq_42350785/article/details/123317262