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
题解
回溯通常是一种纯暴力的搜索方式,一般和 递归 是绑在一起出现的
这里只要涉及到以下几种方式,都可以通过回溯法来进行处理和解决。
-
组合,只要包含即可,通常是无序的
-
排列,是有顺序可言的,与组合刚好不同
-
字符串切割,得到的子串怎么怎么样
-
子集问题
-
棋盘问题,N皇后,解数独
回溯
关于这道题,我们可以先进行画出一个 树的结构 来查看。
注意我们递归时传递的参数,只需要传递每次开始的值 和 当前数组。
每次判断数组的长度是否 === k,来将值,push 到res中进行保存。
之后的每次push完后,需要再进行弹出操作
const combine = (n, k) => {
const res = []
const search = (start, arr) => {
if (arr.length === k) {
res.push([...arr])
return
}
for (let i = start; i <= n; i++) {
arr.push(i)
search(i + 1, arr)
// 每次push完后,再进行弹出操作
arr.pop()
}
}
search(1, [])
return res
}
总结
该题目 17 :组合 在 回溯方法中的使用。一般通过画出树结构,可以清晰的解决此类问题。