hot100 -- 10.回溯系列
1.全排列
问题:给定一个不含重复数字的数组 nums
,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
方法:回溯法(固定当前位置,处理后续元素)
# 全排列:回溯法(固定每个位置,并处理剩余元素,以遍历所有可能)
# 初始:[1,2,3]
# 1固定 → 处理[2,3] → 得到[1,2,3]和[1,3,2]
# 2固定 → 处理[1,3] → 得到[2,1,3]和[2,3,1]
# 3固定 → 处理[1,2] → 得到[3,1,2]和[3,2,1]def permute(nums):res = []def backtrack(first):# 筛完一轮if first == len(nums):res.append(nums.copy()) # 拷贝,防止res跟着nums变return# 固定first及以前的,处理后续的所有可能for i in range(first, len(nums)):nums[first], nums[i] = nums[i], nums[first] # 交换backtrack(first+1) # 处理后续元素nums[first], nums[i] = nums[i], nums[first] # 回溯(换回来)backtrack(0)return resprint(permute([1,2,3]))
2.子集
问题:
给你一个整数数组 nums
,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
方法1:回溯法
# 方法1:回溯法
def subsets(nums):res = [[]] # 保存最终结果path = [] # 包含子集def backtrack(first, path):for i in range(first, len(nums)):path.append(nums[i]) # 记录当前子集res.append(path.copy()) # 将当前子集添加进结果backtrack(i+1, path) # 尝试后面的可能path.pop() # 回溯backtrack(0, [])return res
方法2:迭代法
# 方法2:迭代法(保存之前元素,逐步扩展后续元素)
def subsets(nums):res = [[]]for num in nums:res += [subset + [num] for subset in res]return res