LeetCode Everyday - 没有重复元素集合的全排列

240 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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;
};

最后

如果有更好的解法或者思路, 欢迎在评论区和我交流~ ღ( ´・ᴗ・` )