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

leetcode思路-回溯相关(46.全排列、78.子集、17.电话号码的字母组合)

46.全排列

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

思路:

使用成员变量nums和res维护当前排列以及所有列举过的排列

固定前缀,递归地对后续元素进行排列组合,每生成一个完整的答案时就回溯返回到上一级

//存储当前排列 List<Integer> nums; //存储所有排列 List<List<Integer>> res; public List<List<Integer>> permute(int[] nums) { this.nums = new ArrayList<>(); this.res = new ArrayList<>(); //初始化nums for(int num:nums){ this.nums.add(num); } //固定第一位开始排列组合,也就是固定nums[0] DFS(0); return res; } //当前递归做的事情: //将当前位数的数字分别与其后置位每个数字交换一次,然后进到下一层递归,注意每次递归完后要进行回溯 void DFS(int x){ //如果当前固定的位数已经是倒数第二位,那么不需要再进行排列组合 // 因为后面只有一位数,没人跟它交换 if(x == nums.size() - 1){ res.add(new ArrayList<>(nums)); return; } for(int i = x;i < nums.size();i++){ swap(i,x); //将该固定的首位向右移动一位,达到进入下一层递归的效果 DFS(x + 1); //回溯 swap(i,x); } } void swap(int i,int x){ int temp = nums.get(i); nums.set(i,nums.get(x)); nums.set(x,temp); }

78.子集

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

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

思路:

使用成员变量ans和path维护所有子集和当前路径

从第一个元素开始递归地进行选择,要么添加进当前路径、要么不添加,直到选择的次数与集合内元素数量相等(即一个子集构建完成)、将当前路径加入ans中。

注意,每个路径选择完成后都要进行回溯,保护每个路径构建过程独立不受干扰。

List<List<Integer>> ans; List<Integer> path; public List<List<Integer>> subsets(int[] nums) { this.ans = new ArrayList<>(); this.path = new ArrayList<>(); DFS(0,nums); return ans; } public void DFS(int i,int[] nums){ //全部选择完成,将当前路径添加到子集集合中 if(i == nums.length){ ans.add(new ArrayList<>(path)); return; } //如果不选择当前元素 DFS(i + 1,nums); //如果选择当前元素 path.add(nums[i]); DFS(i + 1,nums); //回溯 path.remove(path.size() - 1); }

17.电话号码的字母组合

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

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

思路:

使用成员变量ans维护所有可能字母组合

使用一个变量代表递归次数(也就是当前路径长度)

当前递归做的事情:

对当前传入的电话号码,选择一个其代表的字母(选择哪个字母由当前遍历的次数决定)添加到路径里,路径长度加一,进入下一层递归

结束递归条件:

路径长度满足传入电话号码数量

public final String[] MAP = new String[]{"","","abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; List<String> ans; public List<String> letterCombinations(String digits) { ans = new ArrayList<>(); int n = digits.length(); if (n == 0) { return List.of(); } char[] path = new char[n]; DFS(0,digits.toCharArray(),path); return ans; } void DFS(int i,char[] digits,char[] path){ if(i == digits.length){ ans.add(new String(path)); return; } int n = digits[i] - '0'; for(char c:MAP[n].toCharArray()){ path[i] = c; DFS(i + 1,digits,path); } }
http://www.jsqmd.com/news/887162/

相关文章:

  • 第一篇:《Docker 是什么?为什么它改变了软件交付》
  • 2026年5月正规的哈尔滨耐火电缆厂家有哪些厂家推荐榜,NH-YJV、NH-BV、NH-KVV、WDZN-YJY型号厂家选择指南 - 海棠依旧大
  • 终极Android应用签名解决方案:Uber APK Signer完整实战指南
  • 2026年5月口碑好的山东耐磨地质钢管源头厂家排行榜厂家推荐榜,R780地质钢管、深井地质钢管、岩心地质钢管厂家选择指南 - 海棠依旧大
  • [智能体-78]:什么是智能体?它包括哪些组件?
  • 量子酉操作逆运算:结构化优化与NISQ应用
  • NAV专业服务推荐榜:BC MES、BC Mobile、BC WMS、BC 移动端、D365、NAV Barcode选择指南 - 优质品牌商家
  • 2026年浸漆铜排选型指南:浸粉铜排、软铜排定制、铜排浸漆、铜排浸粉、铜排软连接、铜箔软连接、定制软连接、定制软铜排选择指南 - 优质品牌商家
  • 保姆级教程:Multisim 14.0 从下载到汉化,手把手教你避开C盘爆满和激活失败的坑
  • 2026年5月专业的上海屋面屋顶防水公司哪家靠谱厂家推荐榜:屋面防水/屋顶漏水/别墅防水工程厂家选择指南 - 海棠依旧大
  • 游轮WiFi覆盖方案复盘:6台5G CPE + AP实现全船高速上网
  • 平安校园安防升级,国标GB28181视频平台EasyGBS实现全区域视频无死角合规管控
  • 终极Hyper-V设备直通解决方案:DiscreteDeviceAssigner图形化工具完整指南
  • 教育机构利用Taotoken为学生提供稳定的大模型编程实验环境
  • 马斯克转发的这张梗图,藏着工程界最朴素的真理
  • 第5章:AI辅助ERC20与ERC721进阶——代币经济学与批量铸造
  • 2026定制软连接技术选型全指南:铜排软连接/铜箔软连接/定制软连接/定制软铜排/柔性软连接/浸漆铜排/浸粉铜排/选择指南 - 优质品牌商家
  • 2026软连接定制技术维度解析与合规企业实测参考:浸粉铜排/软铜排定制/铜排浸漆/铜排浸粉/铜排软连接/铜箔软连接/选择指南 - 优质品牌商家
  • 华为芯片重大进展!何庭波:5年达1.4nm同等水平
  • 【分享】AI记账本 AI识别智能记账 解锁会员版
  • 2026年邯郸有实力的悬架螺栓销售厂家甄选指南:聚焦制造实力与稳定交付 - 2026年企业推荐榜
  • 电信运营商海量工单自动派发和闭环如何实现?基于2026年大模型Agent的技术解构
  • [智能体-79]:主流智能体编排框架一网打尽:先讲作用,再分框架讲定位 + 核心能力 + 优缺点,最后给一张选型对比表和场景推荐,方便你直接落地。
  • 2026年5月新消息发布:昆明学校搬家品牌推荐,专业团队保障教学秩序 - 2026年企业推荐榜
  • PCAN软件隐藏技巧:用VBS脚本控制软件界面,打造专属自动化测试工作流
  • 2026年西安铝合金门窗TOP5推荐:青岛系统门窗/青岛铝合金门窗/青岛门窗/青岛阳光房/青岛阳台封窗/上海断桥铝门窗/选择指南 - 优质品牌商家
  • 2026北京当天收车专业机构实测排行与避坑指南:北京闲置车回收/北京高价回收二手车/北京高价收车/北京上门收二手车/选择指南 - 优质品牌商家
  • 推理引擎debug记(控制变量法)
  • 嵌入式SQLite数据库实验
  • Shopify 分销和独立站分销有什么区别?完整对比指南