【算法】代码随想录训练营Day24打卡, 216.组合总和III 17. 电话号码的字母组合
)
216.组合总和III
力扣链接:https://leetcode.cn/problems/combination-sum-iii/description/
这道题其实就是 77. 组合的一个升级版本,
我们发现,他需要求一个sum,数字只有1-9
那么我们横向的for里,最大的值为9,根据77.组合里的剪枝的思路,我们需要一个start,来减去重复的枝叶
而我们的结束条件则是 负责组合数字的数组长度 === k
而我们收录上述数组的条件则是 Sum == n
所以综上述
我们的dfs应该有三个入参,分别是
负责组合数字的数组 arr,
负责每一条分枝的和的值 sum,
以及负责剪枝避免重复的值 start
解法
/**
* @param {number} k
* @param {number} n
* @return {number[][]}
*/
var combinationSum3 = function(k, n ) {
let res = [];
let dfs = function(result,sum,start){
if(result.length == k){
if(sum==n){
res.push([...result])
}
return;
}
for(let i=start;i<=9;i++){
result.push(i);
dfs(result,sum+i,i+1);
result.pop();
}
}
dfs([],0,1);
return res;
};
17. 电话号码的字母组合
力扣链接: https://leetcode.cn/problems/letter-combinations-of-a-phone-number/description/
这道题其实就是一个很标志的回溯算法问题了,
在数学中也叫做排列组合
题目的意思也很好理解,我们就是要根据输入的按钮数字,来对应映射出可能出现的字母组合方式
那么如何映射按键和字母呢?
其实可以用的方式很多
如通过数组下标来映射
const numarr = ["","","abc","def","ghi","jkl","mno","pqrs",'tuv',"wxyz"]
或者通过map来映射
const note = {
"2":["a","b","c"],
"3":["d","e","f"],
"4":["g","h","i"],
"5":["j","k","l"],
"6":["m","n","o"],
"7":["p","q","r","s"],
"8":["t","u","v"],
"9":["w","x","y","z"]
}
然后我们再来看,根据dfs的模板,我们首先来确认一下结束的条件
应该是组合的数组的长度 与 输入的字符串长度 digtes的长度相等 就结束
所以结束的条件应该是
if(arr.length === digtes.length){
return res.push(arr) // arr是应有的字母组合
}
那么我们的循环的条件就是按键对应的字母的长度 在这里面遍历取
综上所述解法如下
解法
/**
* @param {string} digits
* @return {string[]}
*/
var letterCombinations = function(digits) {
const res = [];
if(digits.length === 0 ) return res;
const numarr = ["","","abc","def","ghi","jkl","mno","pqrs",'tuv',"wxyz"]
const dfs = (arr,number)=>{
if(arr.length === digits.length){
return res.push( arr.join(""))
}
let curArr = numarr[parseInt(digits[number])];;
for(let i=0;i<curArr.length;i++){
arr.push(curArr[i]);
dfs(arr,number+1);
arr.pop();
}
}
dfs([],0);
return res;
};