Open
Description
给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combinations
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
定义一个 helper 函数,递归的时候接受本次处理的 start
起始位置,和上一次已经取了字符后得到的 prev
数组。继续进一步的循环递归,增加 start
和拼接 prev
即可。
当 prev
的长度等于 k
时,条件满足,把当前的 prev
存入结果数组中。
/**
* @param {number} n
* @param {number} k
* @return {number[][]}
*/
let combine = function (n, k) {
let ret = []
let helper = (start, prev) => {
let len = prev.length
if (len === k) {
ret.push(prev)
return
}
if (start > n) {
return
}
for (let i = start; i <= n; i++) {
helper(i + 1, prev.concat(i))
}
}
helper(1, [])
return ret
}
剪枝
在循环中,要考虑当前已经凑成的数组长度和剩下的数字所能凑成的最大长度,对于不可能凑成的情况直接 continue
。
let combine = function (n, k) {
let ret = []
let helper = (start, prev) => {
let len = prev.length
if (len === k) {
ret.push(prev)
return
}
if (start > n) {
return
}
// 还有 rest 个位置待填补
let rest = k - prev.length
for (let i = start; i <= n; i++) {
if (n - i + 1 < rest) {
continue
}
helper(i + 1, prev.concat(i))
}
}
helper(1, [])
return ret
}