回溯
46. 全排列:不含重复元素
def backtrack():
if len(path) == len(nums):
result.append(list(path))
else:
for i in range(len(nums)):
# 剪枝
if nums[i] not in path:
path.append(nums[i])
backtrack()
path.pop()
47. 全排列 II:包含重复元素
剪枝条件为
如果该元素被选择过 或者 该元素不是第一个元素且在 nums 列表中的上一个元素和该元素相同(要求 nums 是排好序的),则跳过
def backtrack():
if len(path) == len(nums):
result.append(list(path))
else:
for i in range(len(nums)):
# 理解剪枝
if selected[i] or (i > 0 and nums[i] == nums[i - 1] and not selected[i - 1]):
continue
path.append(nums[i])
selected[i] = True