Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目描述
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1:
输入: nums = [1,2,3]
输出: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:
输入: nums = [0,1]
输出: [[0,1],[1,0]]
示例 3:
输入: nums = [1]
输出: [[1]]
提示:
1 <= nums.length <= 6-10 <= nums[i] <= 10nums中的所有整数 互不相同
题解
回溯通常是一种纯暴力的搜索方式,一般和 递归 是绑在一起出现的
这里只要涉及到以下几种方式,都可以通过回溯法来进行处理和解决。
-
组合,只要包含即可,通常是无序的
-
排列,是有顺序可言的,与组合刚好不同
-
字符串切割,得到的子串怎么怎么样
-
子集问题
-
棋盘问题,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
}
总结
该题目 18 :组合 在 回溯方法中的使用。一般通过画出树结构,可以清晰的解决此类问题。