获取全排列
不重复数据
def permute(nums): res = [] def backtrack(path, used): if len(path) == len(nums): res.append(path[:]) # 拷贝一份 return for i in range(len(nums)): if used[i]: continue used[i] = True path.append(nums[i]) backtrack(path, used) path.pop() # 撤销选择 used[i] = False # 恢复状态 backtrack([], [False] * len(nums)) return res print(permute([1, 2, 3])) # [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
有重复数据
def permute_unique(nums): nums.sort() # 先排序,让相同元素相邻 res = [] def backtrack(path, used): if len(path) == len(nums): res.append(path[:]) return for i in range(len(nums)): if used[i]: continue # 去重:当前元素和前一个相同,且前一个未被使用(说明是同一层) if i > 0 and nums[i] == nums[i-1] and not used[i-1]: continue used[i] = True path.append(nums[i]) backtrack(path, used) path.pop() used[i] = False backtrack([], [False] * len(nums)) return res print(permute_unique([1, 1, 2])) # [[1,1,2],[1,2,1],[2,1,1]]

浙公网安备 33010602011771号