216.组合总和Ⅲ
题目链接:
https://leetcode.cn/problems/combination-sum-iii/
题目描述:
找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:
只使用数字1到9
每个数字 最多使用一次
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
输入: k = 3, n = 7
输出: [[1,2,4]]
解释:
1 + 2 + 4 = 7
没有其他符合的组合了。
思路:
使用递归回溯的方法,从小到大依次选取数字,将问题转化为选取当前数字+在剩余数字中选取的子问题。终止条件为选取的数字数量为k,递归函数的参数是当前能选取的最小数字,每层递归中选取
当前能选取的最小数字并处理子问题后将选取的数字清除。
代码:
var combinationSum3 = function(k, n) {
let res = []
let path = []
function sum(arr) {
let s = 0;
for (let i=arr.length-1; i>=0; i--) {
s += arr[i];
}
return s;
}
function backtracking(start){
if(path.length === k){
if(sum(path) === n){
res.push([...path])
}
return
}
else{
for(let j = start; j < 10; j++){
path.push(j)
backtracking(j + 1)
path.pop()
}
}
}
for(let i = 1; i < 10; i++){
path.push(i)
backtracking(i + 1)
path.pop()
}
return res
};
17.电话号码的字母组合
题目链接:
https://leetcode.cn/problems/letter-combinations-of-a-phone-number/
题目描述:
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
思路:
最直观的想法就是遍历题目给出的数字,多层循环嵌套得出结果。但是组合问题的for循环数往往不确定,很难直接写出。可以使用回溯的方法进行代替,将问题一步一步地解决。由于1回溯法之前提到过很多次,这里就不再赘述了。
本题的输入是数字,要求我们把数字对应的字母写出,这就涉及到一个对应问题了,我使用数组来对应数字与字母。
代码:
var letterCombinations = function(digits) {
let res = []
let path = []
let dic = [
'',
'',
['a','b','c'],
['d','e','f'],
['g','h','i'],
['j','k','l'],
['m','n','o'],
['p','q','r','s'],
['t','u','v'],
['w','x','y','z']
]
function backtracking(indexOfDigits){
if(indexOfDigits === digits.length){
res.push(path.join(''))
return
}
dic[digits.at(indexOfDigits)].forEach((i)=>{
path.push(i)
backtracking(indexOfDigits + 1)
path.pop()
})
}
if(!digits) return []
backtracking(0)
return res
};
标签:return,数字,day25,res,javascript,随想录,let,path,backtracking
From: https://www.cnblogs.com/endmax/p/16972890.html