Leetcoder Day22| 回溯part02:组合总和+字母组合

语言:Java/Go

216.组合总和III

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

说明:

  • 所有数字都是正整数。
  • 解集不能包含重复的组合。

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

示例 2: 输入: k = 3, n = 9 输出: [[1,2,6], [1,3,5], [2,3,4]]

  本题和上一章组合题基本类似,就是这里限制了组合的范围为[1,9]所以相当于在循环中需要用9来限制循环次数。这里递归结束条件就是找到了和为n的k个数的组合,因此可以设置一个sum惨参数来计算当前的和。每次递归都要伴随着回溯,回溯就是把sum减去当前的元素,path去掉当前元素。剪枝操作在循环条件中和上一题是一致的,就是用9-(path.size())+1,这里还要注意一个隐藏条件,如果当前的sum已经大于要求的n,也可以停止循环了。记住在这个判断里依然要进行回溯。

class Solution {List<List<Integer>> res= new ArrayList<>();LinkedList<Integer> path = new LinkedList<>();public void backTracking(int k, int n, int sum, int startIdx){if(path.size()==k){if(n==sum){  //已有k个数且和为nres.add(new ArrayList<>(path));}return;}for(int i=startIdx;i<=9-(k-path.size())+1;i++){ //进行剪枝,如果sum大于n,结束递归sum+=i;path.add(i);if(sum>n){sum-=i;path.removeLast();return;}backTracking(k, n, sum, i+1);sum-=i;path.removeLast();}}public List<List<Integer>> combinationSum3(int k, int n) {backTracking(k,n,0,1);return res;}
}

17.电话号码的字母组合

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

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

示例 1:

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

示例 2:

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

示例 3:

输入:digits = "2"
输出:["a","b","c"]

本题看到的时候比较好奇,字母和数字之间的映射怎么巧妙处理,代码随想录里给出的方法是用map或者二维数组进行映射,2-9都有对应的祖母,0和1用空字符来替代,在java中表示如下:

String[] numString = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};

终止条件就是如果startIdx 等于 输入的数字个数(digits.size)了(本来index就是用来遍历digits的)。

class Solution {List<String> res = new ArrayList<>();//涉及大量的字符串拼接,所以这里选择更为高效的 StringBuildStringBuilder temp = new StringBuilder();String[] numString = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};public List<String> letterCombinations(String digits) {if(digits==null || digits.length()==0){return res;}backTracking(digits, 0);return res;}public void backTracking(String digits, int startIdx){if(startIdx==digits.length()){// 字符串长度length()res.add(temp.toString());  return;}//用str表示数字对应的字符串/*digits.charAt(startIdx)表示当前第startIdx个元素对应的数字,初始值为0如‘23’,startIdx=0,所以当前要取的是‘2’,这里是字符串digits.charAt(startIdx)-'0'表示‘2’与‘0’之间的差值。这样做的目的是将字符数字转换为对应的整数值。所以这里就变成了整数2numString(digits.charAt(startIdx)-'0')对应的就是2所对应的字母‘abc’*/String str=numString[digits.charAt(startIdx)-'0']; for(int i=0;i<str.length();i++){temp.append(str.charAt(i));backTracking(digits, startIdx+1);temp.deleteCharAt(temp.length()-1);}} }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/492463.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python图像处理初步

文章目录 处理流程灰度分布图 处理流程 在Python中&#xff0c;通过【plt】和【numpy】可以实现图像处理的最简单的流程&#xff0c;即读取图片->处理图片->显示结果->保存结果。 import matplotlib.pyplot as plt import numpy as nppath lena.jpg img plt.imrea…

python自带轻量级键值数据库shelve

使用python自带的shelve模块&#xff0c;可以作为轻量级的键值数据库&#xff0c;在使用时可以像字典一样使用&#xff1a; 使用shelve模块的流程如下&#xff1a; 示例程序 import pandas as pd import shelve import numpy as npdef main():_shelve_file "shelve_fi…

ABBYY FineReader16文档转换、PDF管理与文档比较功能介绍

ABBYY FineReader 16作为一款OCR和PDF一体化程序&#xff0c;其强大的功能使得文档处理变得简单高效。在众多功能中&#xff0c;文档转换、PDF管理和文档比较这三大功能尤为突出&#xff0c;成为了众多企业和个人用户的首选工具。 ABBYY Finereader 16-安装包下载如下&#xff…

GitHub下载器,老司机懂的都懂!

有些老司机或者做项目的小伙伴对GitHub应该不陌生吧&#xff0c;然而GitHub的下载速度非常让人不忍直视&#xff01; 而GitHub高速下载器是一款专门用于加速在GitHub上下载资源的软件&#xff0c;解决了许多用户在下载GitHub资源时遭遇的速度慢和下载失败的问题。 本教程将详细…

通过css修改video标签的原生样式

通过css修改video标签的原生样式 描述实现结果 描述 修改video标签的原生样式 实现 在控制台中打开设置&#xff0c;勾选显示用户代理 shadow DOM&#xff0c;就可以审查video标签的内部样式了 箭头处标出来的就是shodow DOM的内容&#xff0c;这些内容正常不可见的&#x…

操作系统——处理机调度

文章目录 进程调度0.概念1.调度分类高级调度低级调度中级调度七状态模型调度对比 2.进程调度进程调度的时机进程调度的方式进程的切换方式调度器/调度程序闲逛进程 3. 调度算法的评价指标CPU利用率系统吞吐量周转时间等待时间响应时间 4. 调度算法先来先服务(FCFS)短作业优先(S…

【MATLAB源码-第148期】基于matlab的BP神经网络2/4ASK,2/4FSK,2/4PSK信号识别仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 调制技术基础 调制技术是通信技术中的基础&#xff0c;它允许数据通过无线电波或其他形式的信号进行传输。调制可以根据信号的振幅、频率或相位的变化来进行&#xff0c;分别对应于ASK、FSK和PSK。 1.1 2ASK与4ASK 振幅…

二叉树与堆

目录 1.树概念及结构 1.1树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2.二叉树概念及结构 2.1概念 2.2现实中的二叉树&#xff1a; 2.3 特殊的二叉树&#xff1a; 2.4 二叉树的性质 2.5 二叉树的…

C++基础知识(七:多态)

一、多态 常说的多态&#xff0c;是发生在类之间的多态 函数重载(静态多态/编译时多态) 类之间的多态(动态多态/运行时多态) 【1】前提 继承是多态的前提 虚函数 什么是多态&#xff1a;相同的代码&#xff0c;实现不同的功能 【2】函数重写(override) 必须有继承关系父类中必须…

淘宝天猫商品详情API接口(商品详情页面数据,销量接口)

淘宝商品详情API接口&#xff0c;淘宝商品销量接口&#xff0c;淘宝商品价格接口&#xff0c;淘宝商品列表接口&#xff0c;淘宝商品数据列表接口&#xff0c;淘宝关键词搜索列表接口&#xff0c;淘宝APP详情接口&#xff0c;淘宝APP商品详情接口&#xff0c;淘宝H5详情接口&am…

Python判断列表里是否有重复元素的三种方法

一、用set方法去重后与原列表长度比较 lst[1,3,5,3,4,4,2,9,6,7] set_lstset(lst) #set会生成一个元素无序且不重复的可迭代对象&#xff0c;也就是我们常说的去重 if len(set_lst)len(lst):print(列表里的元素互不重复&#xff01;) else:print(列表里有重复的元素&#xff01…

自动换刀主轴应用领域有哪些?

自动换刀主轴是一种先进的机床技术&#xff0c;能够实现快速、准确地更换刀具&#xff0c;提高加工效率和精度&#xff0c;因此在现代制造业中得到了广泛应用。 一、自动换刀主轴的应用领域 1.汽车制造业 汽车制造业是自动换刀主轴应用最广泛的领域之一。在汽车制造过程中&am…