LeetCode全排列

给定一个不含重复数字的数组 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]]

var permute = function(nums) {
    const result = [];
            if (nums.length === 1) {
                return [nums];
            } else {  //遍历每一项
                for (let i = 0; i < nums.length; i++) {
                    let first = nums[i];   //拿到当前的元素
                    let left = nums.slice(0, i).concat(nums.slice(i + 1));  //除当前元素的其他元素组合
                    let rest = permute(left);     //上一次递归返回的全排列
                    for (let j = 0; j < rest.length; j++) {    //组合在一起
                        let next = [first].concat(rest[j]);
                        result.push(next);
                    }
                }
            }
        return result;
};

这道题主要是利用了算法的回溯思想,算法的截止条件是当数组里面只剩一个数的时候返回它本身,将每次遍历时的 i 取出,剩下的组成新的数组,新的数组不断地回溯,最终实现全排列

代码分析

逐步分析 permute 函数如何对数组 [1, 2, 3] 进行全排列。

  1. 初始调用

    • nums = [1, 2, 3]
    • 调用 permute(nums)
  2. 基本情况检查

    • nums.length 是3,不等于1,所以不满足基本情况,继续执行循环。
  3. 循环遍历数组

    • 第一次循环,i = 0
      • first = nums[0]first = 1
      • left = nums.slice(1)left = [2, 3]
      • 递归调用 permute(left)
        • nums = [2, 3],继续同样的逻辑。
  4. 递归调用

    • [2, 3] 进行同样的步骤:
      • 第一次循环(i = 0),first = 2left = [3],递归调用 permute([3])
      • permute([3]) 满足基本情况,返回 [[3]]
      • [3]first = 2 结合,得到 [2, 3] 并添加到结果中。
  5. 继续递归

    • 回到 [2, 3]permute 调用,进行第二次循环(i = 1):
      • first = 3left = [2],递归调用 permute([2])
      • permute([2]) 同样满足基本情况,返回 [[2]]
      • [2]first = 3 结合,得到 [3, 2] 并添加到结果中。
  6. 组合结果

    • 现在我们已经得到了 [2, 3][3, 2] 的排列,将它们与最初的 first = 1 结合:
      • 结合 [1][2, 3] 得到 [1, 2, 3]
      • 结合 [1][3, 2] 得到 [1, 3, 2]
  7. 完成第一次循环

    • 继续 nums 的外层循环,i = 1
      • first = 2left = [1, 3],递归调用 permute([1, 3])
    • [1, 3] 重复上述步骤,得到排列 [2, 1, 3][3, 1, 2]
  8. 完成第二次循环

    • 最后,i = 2
      • first = 3left = [1, 2],递归调用 permute([1, 2])
    • 再次重复,得到排列 [3, 1, 2][3, 2, 1]
  9. 最终结果

    • 所有这些排列被添加到 result 数组中,最终返回包含所有全排列的数组。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值