一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情。
1.题目一
77. 组合
给定两个整数 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
思路
这题已经刷过很多遍了,最基本的dfs模板题目,
回溯法三部曲
- 递归函数的返回值以及参数
- 回溯函数终止条件
- 单层搜索的过程
代码
let result = []
let path = []
var combine = function (n, k) {
let res = [];
let path = []
var dfs = (index)=> {
if(path.length == k) {
// 这里Push的元素是一个数组,引用类型,后面path.pop后,元素又改了!!!
// 所以这里要拷贝一份才行!!!
res.push(path.slice())
return
}
for(let i = index; i <= n; i++) {
path.push(i)
dfs(i + 1)
path.pop()
}
}
dfs(1)
return res
};
1.题目二
216. 组合总和 III
找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:
只使用数字1到9
每个数字 最多使用一次
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
示例 1:
输入: k = 3, n = 7
输出: [[1,2,4]]
解释:
1 + 2 + 4 = 7
没有其他符合的组合了。
示例 2:
输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
解释:
1 + 2 + 6 = 9
1 + 3 + 5 = 9
2 + 3 + 4 = 9
没有其他符合的组合了。
示例 3:
输入: k = 4, n = 1
输出: []
解释: 不存在有效的组合。
在[1,9]范围内使用4个不同的数字,我们可以得到的最小和是1+2+3+4 = 10,因为10 > 1,没有有效的组合。
思路 经典的回溯题了,这次又规定了不能重复,又有固定数组(1-9);可以很简单的写出来。 基本思路就是从1开始找,然后在第i个循环中从i开始,如果这个数字已经比需要的大了,直接退循环; 如果小了就是 入组->继续->复原->下一个 target在每次选择了一个数字后,减去改数字就行,不过不知道为什么时长挺长的,看了大佬有更好的方法 希望评论区告知一下
代码
var combinationSum3 = function (k, n) {
let res = []
let path = [];
let sum = 0;
const dfs = (j, sum) => {
if(path.length > k) {
return
}
if(path.length === k && sum === n) {
res.push(path.slice())
return
}
for(let i = j; i <= 9; i++) {
if(sum + i > n) {
continue
}
sum += i
path.push(i)
dfs(i+1, sum)
path.pop()
sum -= i
}
}
dfs(1, 0)
return res;
};