Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
组合
给定两个整数 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 <= 201 <= k <= n
思路分析
- 分析下题目,以示例一为例:选组合的第一个数时有四种选择,每个都可以当做第一个数;选择第二个数时,本来也有四种选择,但是有的会产生重复,比如说
[1,2]和[2,1],[1,3]和[3,1]等。因为要求不能重复,因此这种重合的数据需要被剔除,它们无法得到正确的完整解; - 分析完成后,可以定义一个数组来存储正在构建的解集;
- 定义一个辅助函数
help接受枚举选择的起点以及当前构建的路径为入参,定义一个结果数组result,在辅助函数中,构建路径的长度等于k时,将当前路径的值存储到result中,结束当前递归;在构建路径长度小于k时,需要递归处理其他值作为起点的路径。
AC 代码
/**
* @param {number} n
* @param {number} k
* @return {number[][]}
*/
var combine = function(n, k) {
const res = []
const help = (start, path) => {
if (path.length == k) {
res.push([...path])
return
}
for (let i = start; i <= n; i++) {
path.push(i)
help(i + 1, path)
path.pop()
}
};
help(1, [])
return res
};
结果:
- 执行结果: 通过
- 执行用时:120 ms, 在所有 JavaScript 提交中击败了22.42%的用户
- 内存消耗:45.8 MB, 在所有 JavaScript 提交中击败了43.32%的用户
- 通过测试用例:27 / 27