77,组合
题目描述
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。
示例
输入:n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
题解
代码:
/**
就是相当于 横向为n,纵向为k,注意剪枝,当余下的数组个数小于k的时候,return
*/
var combine = function(n, k) {
let res = []
dfs(n,k,1,[])
return res
function dfs(n,k,idx,path){
// 如果收集到的数组的长度和k相等的时候,就保存结果,介绍循环
if(path.length == k){
res.push([...path])
return
}
// 剪枝,当余下的可选择的数字加上path的长度不够k的时候,就结束循环
if(path.length + n - idx + 1 < k){
return
}
// 选择当前位置
dfs(n,k,idx + 1,[...path,idx])
// 不选择当前位置
dfs(n,k,idx + 1,path)
// 使用循环的效率较低
// for(let i = idx;i <= n;i++){
// dfs(n,k,i + 1,[...path,i])
// }
}
};