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

代码随想录 算法训练 Day22:回溯算法part01

题目一

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

示例 1:

输入:n = 4, k = 2
输出:
[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],
]

示例 2:

输入:n = 1, k = 1
输出:[[1]]

提示:

  • 1 <= n <= 20
  • 1 <= k <= n
class Solution {List<Integer> path = new ArrayList<>();List<List<Integer>> result = new ArrayList<>();public List<List<Integer>> combine(int n,int k){backtracking(n,k,1);return result;}public void backtracking(int n,int k,int start){if(path.size() == k){result.add(new ArrayList<>(path));return;}for(int i = start;i <= n;i++){// 循环内剪枝(当前剩余元素不够)if((path.size() + n - i + 1) < k) break;path.add(i);backtracking(n,k,i + 1);path.remove(path.size() - 1);}}
}

题目二

找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:

  • 只使用数字1到9
  • 每个数字 最多使用一次 

返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

class Solution {List<Integer> path = new ArrayList<>();List<List<Integer>> result = new ArrayList<>();int sum = 0;public List<List<Integer>> combinationSum3(int k, int n) {backtracking(k,n,1);return result;}public void backtracking(int k,int n,int start){if (sum > n) return;if(path.size() == k&&sum == n){result.add(new ArrayList<>(path));return;}for(int i = start ; i <= 9 ;i++){if((sum + i > n)||(path.size() + 10 - i < k)) break;sum = sum + i;path.add(i);backtracking(k,n,i + 1);path.remove(path.size() - 1);sum = sum - i;}}
}

题目三

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

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

示例 1:

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

示例 2:

输入:digits = ""
输出:[]

示例 3:

输入:digits = "2"
输出:["a","b","c"]
class Solution {// 数字到字母的映射表private static final String[] LETTER_MAP = {"",     // 0"",     // 1"abc",  // 2"def",  // 3"ghi",  // 4"jkl",  // 5"mno",  // 6"pqrs", // 7"tuv",  // 8"wxyz"  // 9};public List<String> letterCombinations(String digits) {List<String> result = new ArrayList<>();if (digits == null || digits.isEmpty()) {return result;}backtrack(result, new StringBuilder(), digits, 0);return result;}// 回溯核心方法private void backtrack(List<String> result, StringBuilder current, String digits, int index) {// 终止条件:当前组合长度等于输入数字长度if (index == digits.length()) {result.add(current.toString());return;}// 获取当前数字对应的字母字符串char digit = digits.charAt(index);String letters = LETTER_MAP[digit - '0']; // 将字符转为数字索引// 遍历所有可能的字母for (int i = 0; i < letters.length(); i++) {// 添加当前字母current.append(letters.charAt(i));// 递归处理下一个数字backtrack(result, current, digits, index + 1);// 回溯:删除最后添加的字母current.deleteCharAt(current.length() - 1);}}
}

相关文章:

  • AIGC 基础篇 高等数学篇 03 中值定理与导数应用
  • 大数据学习(130)-zookeeper
  • Linux系统-基本指令(6)
  • 幂等性:保障系统稳定的关键设计
  • C++内联函数(inline)的作用
  • BUU MISC(持续更新)
  • Linux容器篇、第一章docker命令总结表
  • NLP学习路线图(二十二): 循环神经网络(RNN)
  • 【Python指南】离线安装顽固复杂的第三方库指南
  • 嵌入式系统中常用的开源协议
  • (1-6-3)Java 多线程
  • 深度解析ArrayList
  • Java DLL依赖缺失解决思路和修复过程(Windows版本)
  • django paramiko 跳转登录
  • C++ 使用 ffmpeg 解码本地视频并获取每帧的YUV数据
  • 如何用AI高效运营1000+Tiktok矩阵账号
  • Python 训练营打卡 Day 43
  • 玄机-日志分析-IIS日志分析
  • JavaWeb:前端工程化-ElementPlus
  • Hot100 Day02(移动0,乘最多水的容器、三数之和、接雨水)
  • 优化网站的软件下载/广告软文范例大全100
  • 自制模板图用什么软件/seo排名软件哪个好用
  • 带着做计算机项目的网站/郑州seo排名优化公司
  • 网站建设策划报告/聚合搜索引擎入口
  • 视频优化网站怎么做/优化网站的方法
  • b2b网站制作/优化大师是什么