leetcode46-全排列

leetcode 46
在这里插入图片描述

思路

回溯(Backtracking)
  • 通过回溯的方式探索所有可能的排列
  • path 数组用于保存当前的排列。每次我们将一个数字添加到 path 中,直到 path 长度等于 nums 长度,这时候就找到了一个排列,可以将其加入 result
  • used 数组用于标记一个数字是否已经被使用过,避免重复使用
回溯过程:
  • 递归地选择数组中的元素,尝试将其添加到 path 中
  • 如果选择的元素没有被使用过,将其标记为已使用,然后递归进行下一步操作
  • 如果 path 的长度等于 nums 的长度,说明找到了一个有效的排列,将其加入到结果数组 result 中
  • 完成一次递归后,回溯,将当前元素从 path 中移除,并将其标记为未使用。
终止条件:

当 path 的长度等于 nums.length 时,收集结果,终止当前递归分支。

实现

var permute = function (nums) {
  let result = [], path = [];
  const backtracking = (nums, used) => {
    if (path.length === nums.length) {
      // 收集结果值
      result.push([...path])
      return;
    }
    for (let i = 0; i < nums.length; i++) {
      if (!used[i]) {
        // 可以使用当前值
        path.push(nums[i])
        used[i] = true;
      } else {
        continue;
      }
      backtracking(nums, used)
      // 回溯
      path.pop()
      used[i] = false;
    }
  }
  backtracking(nums, new Array(nums.length).fill(false))
  return result;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值