2026/1/27 13:19:46
网站建设
项目流程
网站制作湖州,供求信息平台,如何推广自己的网址,厦门海投工程建设有限公司网站题目#xff1a;思路#xff1a;启动阶段#xff1a;初始化空结果集 res#xff0c;调用回溯函数 backtrack([], 0)#xff0c;以空路径为起点#xff0c;从数组第0个元素开始遍历选择递归遍历阶段#xff1a;进入回溯函数后#xff0c;先将当前路径副本存入 res#…题目思路启动阶段初始化空结果集 res调用回溯函数 backtrack([], 0)以空路径为起点从数组第0个元素开始遍历选择递归遍历阶段进入回溯函数后先将当前路径副本存入 res再从 start 索引开始遍历数组元素依次执行“选元素→递归调用→撤销选择”的循环回溯探索阶段每次递归调用将 start 索引1限制后续选择范围递归返回后通过 pop() 撤销选择切换到“不选当前元素”的分支继续遍历终止与收尾阶段当遍历索引超出数组长度时递归自然终止所有分支遍历完成后res 已收集全部子集最终返回 res代码class Solution: def subsets(self, nums: List[int]) - List[List[int]]: res [] def backtrack(path,start): res.append(path.copy()) for i in range(start,len(nums)): path.append(nums[i]) backtrack(path,i1) path.pop() backtrack([],0) return res例子以nums [1,2,3]为例一步步拆解回溯法的执行过程回溯函数的两个关键参数path当前已选中的元素start当前开始遍历的索引避免重复选比如选了 2 就不再回头选 1。核心规则每次进入回溯函数先把当前path加入结果集哪怕是空集再遍历start到末尾的元素依次做 “选” 或 “不选” 的决策。步骤 1初始调用backtrack([], 0)此时path []start 0。第一步把[]加入结果集结果集现在[[]]第二步遍历i 0,1,2对应元素 1、2、3先处理i0元素 1。决策 1选元素 1path变为[1]递归调用backtrack([1], 1)start变为 1因为下一个只能选 2、3。步骤 2执行backtrack([1], 1)此时path [1]start 1。第一步把[1]加入结果集结果集[ [], [1] ]第二步遍历i 1,2对应元素 2、3先处理i1元素 2。决策 2选元素 2path变为[1,2]递归调用backtrack([1,2], 2)start变为 2下一个只能选 3。步骤 3执行backtrack([1,2], 2)此时path [1,2]start 2。第一步把[1,2]加入结果集结果集[ [], [1], [1,2] ]第二步遍历i 2对应元素 3处理i2元素 3。决策 3选元素 3path变为[1,2,3]递归调用backtrack([1,2,3], 3)start变为 3超出数组长度。步骤 4执行backtrack([1,2,3], 3)此时start 3超出数组长度len(nums)3遍历循环不执行。第一步把[1,2,3]加入结果集结果集[ [], [1], [1,2], [1,2,3] ]第二步无遍历递归返回。回溯撤销 “选 3” 的决策回到backtrack([1,2], 2)执行path.pop()path变回[1,2]遍历i2处理完毕无更多i递归返回。回溯撤销 “选 2” 的决策回到backtrack([1], 1)执行path.pop()path变回[1]继续处理遍历的下一个i2元素 3。步骤 5回到backtrack([1], 1)处理i2元素 3决策 4选元素 3path变为[1,3]递归调用backtrack([1,3], 3)start3。执行backtrack([1,3], 3)第一步把[1,3]加入结果集结果集[ [], [1], [1,2], [1,2,3], [1,3] ]第二步无遍历递归返回。回溯撤销 “选 3” 的决策回到backtrack([1], 1)执行path.pop()path变回[1]遍历i1,2处理完毕递归返回。回溯撤销 “选 1” 的决策回到初始的backtrack([], 0)执行path.pop()path变回[]继续处理遍历的下一个i1元素 2。步骤 6初始调用处理i1元素 2决策 5选元素 2path变为[2]递归调用backtrack([2], 2)start2。执行backtrack([2], 2)第一步把[2]加入结果集结果集[ [], [1], [1,2], [1,2,3], [1,3], [2] ]第二步遍历i2元素 3处理i2。决策 6选元素 3path变为[2,3]递归调用backtrack([2,3], 3)。执行backtrack([2,3], 3)第一步把[2,3]加入结果集结果集[ [], [1], [1,2], [1,2,3], [1,3], [2], [2,3] ]第二步无遍历递归返回。回溯撤销 “选 3”→ 撤销 “选 2”回到初始的backtrack([], 0)path变回[]继续处理i2元素 3。步骤 7初始调用处理i2元素 3决策 7选元素 3path变为[3]递归调用backtrack([3], 3)。执行backtrack([3], 3)第一步把[3]加入结果集最终结果集[ [], [1], [1,2], [1,2,3], [1,3], [2], [2,3], [3] ]第二步无遍历递归返回。回溯撤销 “选 3”回到初始的backtrack([], 0)遍历结束整个回溯过程完成。