当前位置: 首页 > news >正文

leetcode-hot100-10回溯

3.回溯

文章目录

  • 3.回溯
        • 46.全排列
          • 方法一:c
          • 方法一:js
          • 方法一:java
        • 78.子集
          • 方法一:c
          • 方法一:js
          • 方法一:java
        • 17.电话号码的字母组合
          • 方法一:c
          • 方法一:js
          • 方法一:java
        • 39.组合总和
          • 方法一:c
          • 方法一:js
          • 方法一:java
        • 22.括号生成
          • 方法一:c
          • 方法一:js
          • 方法一:java
        • 79.单词搜索
          • 方法一:c
          • 方法一:js
          • 方法一:java
        • 131.分割回文串
          • 方法一:c
          • 方法一:js
          • 方法一:java
        • 51.N 皇后
          • 方法一:c
          • 方法一:js
          • 方法一:java
46.全排列

给定一个不含重复数字的数组nums,返回其所有可能的全排列。你可以按任意顺序返回答案。

输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
方法一:c

回溯(做选择 -> 递归 -> 撤销选择) = “试探 + 撤销”,深度优先搜索 + 回退,尝试一条路,如果不通,就“退回去”试别的路。

class Solution{public:vector<vector<int>>permute(vector<int>&nums){vector<vector<int>>result;// 结果集:存储所有生成的全排列组合vector<bool>used(nums.size(),false);//标记数组:长度与nums一致,false表示对应位置数字未被使用,true表示已使用vector<int>path;// 路径数组:存储当前递归分支中正在构建的单个排列backtrack(nums,used,path,result);// 调用回溯函数,开始深度优先搜索所有排列可能returnresult;// 返回最终生成的所有全排列结果}// 注意:原代码此处缺少闭合大括号,已补充修正private:// 回溯核心函数:递归遍历所有排列可能,构建并收集全排列//nums:原始输入数组,提供排列的数据源|used:标记数组,记录数字使用状态|path:当前构建的排列路径|result:结果集,收集所有完整排列voidbacktrack(vector<int>&nums,vector<bool>&used,vector<int>&path,vector<vector<int>>&result){if(path.size()==nums.size()){// 递归终止条件:当前路径长度等于原始数组长度,说明已构建出一个完整排列result.push_back(path);// 将当前完整的排列路径添加到结果集中return;// 终止当前递归分支,返回上一层继续探索其他可能}for(inti=0;i<nums.size();++i){// 遍历原始数组中的每一个数字,尝试将其加入当前路径if(used[i])continue;// 剪枝:如果当前数字已被使用(标记为true),则跳过该数字,避免重复选择used[i]=true;// 做出选择:标记当前数字为已使用,防止后续递归重复选取path.push_back(nums[i]);// 做出选择:将当前数字添加到排列路径的末尾,构建当前路径backtrack(nums,used,path,result);// 递归调用:进入下一层递归,继续选择下一个数字构建排列path.pop_back();// 回溯撤销选择:将最后加入的数字从路径中移除,恢复路径状态used[i]=false;// 回溯撤销选择:将当前数字的使用标记重置为false,允许其他分支重新选取}}};
方法一:js
varpermute=function(nums){letresult=[];// 存储最终结果的数组letused=newArray(nums.length).fill(false);// 初始化标记数组letpath=[];// 存储当前路径constbacktrack=()=>{if(path.length===nums.length){// 递归终点result.push([...path]);// 拷贝当前路径并存入结果集return;}for(leti=0;i<nums.length;i++){// 遍历数字if(used[i])continue;// 剪枝:跳过已使用的元素used[i]=true;// 记录当前元素已使用path.push(nums[i]);// 压入路径backtrack();// 递归深搜path.pop();// 回溯:弹出路径末尾元素used[i]=false;// 回溯:释放使用标记}};backtrack();// 开始执行returnresult;// 返回结果};
方法一:java
classSolution{publicList<List<Integer>>permute(int[]nums){List<List<Integer>>res=newArrayList<>();// 结果集boolean[]used=newboolean[nums.length];// 标记数字是否被使用backtrack(nums,used,newArrayList<>(),res);// 开始回溯returnres;}privatevoidbacktrack(int[]nums,boolean[]used,List<Integer>path,List<List<Integer>>res){if(path.size()==nums.length){res.add(newArrayList<>(path));return;}// 路径满则加入结果for(inti=0;i<nums.length;i++){if(used[i])continue;// 已使用则跳过used[i]=true;path.add(nums[i]);// 选择backtrack(nums,used,path,res);// 递归path.remove(path.size()-1);used[i]=false;// 撤销}}}
78.子集

给你一个整数数组nums,数组中的元素互不相同。返回该数组所有可能的子集(幂集)。

解集不能包含重复的子集。你可以按任意顺序返回解集。

输入:nums=[1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
方法一:c
[]├──[1]│ ├──[1,2]│ │ └──[1,2,3]│ └──[1,3]├──[2]│ └──[2,3]└──[3]

核心逻辑共性:子集问题的回溯无需 “使用标记数组”,通过控制遍历起始索引(i+1)避免重复子集,且每一步递归的路径都是一个有效子集(需即时收集)。

class Solution{public:vector<vector<int>>subsets(vector<int>&nums){vector<vector<int>>result;// 存放所有子集的结果集vector<int>path;// 存储当前递归分支构建的子集backtrack(nums,0,path,result);// 从索引0开始回溯构建子集returnresult;// 返回所有子集}private:// 回溯核心函数:从指定索引index开始构建子集voidbacktrack(vector<int>&nums,intindex,vector<int>&path,vector<vector<int>>&result){result.push_back(path);// 收集当前路径(每个节点都是一个有效子集,包含空集)for(inti=index;i<nums.size();++i){// 从index开始遍历,避免重复子集path.push_back(nums[i]);// 做选择:将当前数字加入当前子集backtrack(nums,i+1,path,result);// 递归下一层,i+1保证子集元素不重复且有序path.pop_back();// 撤销选择:回溯,移除当前加入的数字}}};
方法一:js
varsubsets=function(nums){constresult=[];// 存放所有子集的结果集constpath=[];// 存储当前递归分支构建的子集// 定义回溯函数:从指定索引index开始构建子集constbacktrack=(index)=>{result.push([...path]);// 收集当前路径(浅拷贝避免引用问题)for(leti=index;i<nums.length;i++){// 从index开始遍历,避免重复子集path.push(nums[i]);// 做选择:将当前数字加入当前子集backtrack(i+1);// 递归下一层,i+1保证子集元素不重复且有序path.pop();// 撤销选择:回溯,移除当前加入的数字}};backtrack(0);// 从索引0开始回溯构建子集returnresult;// 返回所有子集};
方法一:java
classSolution{publicList<List<Integer>>subsets(int[]nums){List<List<Integer>>res=newArrayList<>();// 结果集backtrack(nums,0,newArrayList<>(),res);// 从索引0开始回溯returnres;}privatevoidbacktrack(int[]nums,intindex,List<Integer>path,List<List<Integer>>res){res.add(newArrayList<>(path));// 每个路径都是子集,直接收集for(inti=index;i<nums.length;i++){path.add(nums[i]);// 选择backtrack(nums,i+1,path,res);// 递归下一层path.remove(path.size()-1);// 撤销}}}
17.电话号码的字母组合

给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合。答案可以按任意顺序返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

输入:digits = "23" 输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
方法一:c

核心逻辑共性:通过索引控制递归层级(处理第 index 位数字),遍历当前数字对应字母→选字母→递归下一位→回溯,最终收集所有完整组合。和上题差不多,形式上会更复杂,因为是字符串,需要额外处理。

class Solution{public:vector<string>letterCombinations(string digits){if(digits.empty(
http://www.jsqmd.com/news/536898/

相关文章:

  • OpenClaw内存优化:让nanobot镜像在4GB设备上流畅运行
  • C语言变量与函数命名规范详解
  • 树莓派X96 一、智能小车初框架(无视觉)
  • SDMatte Web化服务运维指南:supervisorctl管理与日志定位技巧
  • AI教材写作指南:低查重秘诀,快速生成专业教材不是梦!
  • 济南华泰精工:负压出料/高温齿轮泵/高粘度齿轮泵/高精度计量泵/不锈钢泵/分子蒸馏泵/同步分流马达/数字同步马达/选择指南 - 优质品牌商家
  • 51单片机非接触红外测温
  • KAIST团队突破3D游戏世界生成极限:让AI真正理解你的每一个操作
  • 基于CANopen协议的关节电机位置控制方法与实例
  • 像素幻梦创意工坊效果展示:支持透明通道(Alpha)的像素图生成与导出
  • 微信小程序组件事件冒泡问题排查与解决方案
  • VUE.JS 实践 第三章
  • 揭秘AI专著生成秘诀!掌握这些工具,轻松打造专业学术专著
  • SQL 中聚集函数(Aggregate Functions)与 `ANY`/`ALL` 谓词的核心用法、语义等价关系及实际应用要点
  • 在 SAP 中,Cost Object(成本对象) 是归集、控制与结算成本的核心载体,其设置与定义分为主数据创建(前台操作)和后台配置(SPRO)两大场景,不同类型成本对象路径不同
  • Java中的继承:从入门到精通
  • LD8035显示驱动芯片技术文档为何无法生成?
  • MedGemma-X惊艳效果:上传一张胸片,获得多维度结构化诊断分析
  • PyTorch 2.8镜像应用场景:广告公司定制化AI创意生成私有平台案例
  • ChatTTS与OpenVoice本地部署实战:从语音合成到高效推理的完整指南
  • Llama-3.2V-11B-cot实战教程:上传→提问→展开推演→导出结论四步闭环
  • ABAQUS有限元模型:基于CEL算法的斜桩锤击入土模拟
  • 现代C++ | 基础革命特性
  • 吃透 Android 布局资源:从 Chapter2 实战项目看懂四大核心布局
  • 国家金融监督管理总局地市级分支局计算机岗之日常运维:从基础到进阶的全面解析
  • 无源晶振如何用
  • PCB画板时的层数设置
  • Axios + Vue 错误处理规范:中后台项目实战,统一捕获系统 / 业务 / 接口异常|API 与异步请求规范篇
  • 2026 本科论文 AI 工具榜单: 9 款神器,搞定从选题到答辩全流程
  • 边缘AI网关搭建:YOLO12-N在智能交通摄像头中的低延迟部署方案