携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情 >>
没有重复元素集合的全排列
给定一个不含重复数字的整数数组 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] <= 10
- nums 中的所有整数 互不相同
解题思路:
准备一个res记录结果
准备 track 记录路径
准备回溯函数:
其中结束条件为,当路径长度等于给定数组长度时(当决策树走到叶节点时),一条排列结果已经出来,存储在 res 中,并 return;
如果没有,则遍历 nums 中的数,看哪个数还没走过(找出可选择列表);
对可选择列表中的每个数进行:做选择、回溯、取消选择;
跳出最开始进入的回溯函数后,return 结果
我的答案:
/**
思路:
使用回溯的算法思想
求数组的全排列,我们可以把它看成一个数
每个节点都有可能出现三种情况,我们可以使用深度优先结合pop函数回溯到上一节点
* @param {number[]} nums
* @return {number[][]}
*/
var permute = function(nums) {
let res = [];
let track = [];
backtrack(nums, track);
// 递归函数, 用来获取不重复的子数组
function backtrack(nums, track) {
if (nums.length === track.length) return res.push([...track]); // 返回的是新数组的长度,这里没用,只是想代码简洁一点
// 判断后放入track
for (const num of nums)
if (!track.includes(num)) {
track.push(num);
backtrack(nums, track);
track.pop();
}
}
return res;
};
最后
如果有更好的解法或者思路, 欢迎在评论区和我交流~ ღ( ´・ᴗ・` )