回溯算法--全排列

const permute = (nums) => {
  const res = [];
  const used = {};
  dfs([]);
  function dfs(path) {
    if (path.length == nums.length) {
      res.push(path.slice());
      return;
    }
    for (const num of nums) {
      // if (path.includes(num)) continue; // 查找的时间是O(n),这么写增加了时间复杂度
      if (used[num]) continue;
      path.push(num);
      used[num] = true;
      dfs(path);

      path.pop();
      used[num] = false;
//因为有约束条件:不能重复选,在这棵树上我们做“剪枝”,剪去一些不会产生正确解的选择(分支)。
 //用一个数组 used 去记录已经选择的数字,下次遇到相同的选项就直接跳过。这就是剪枝了
 //https://leetcode-cn.com/problems/permutations/solution/chou-xiang-cheng-jue-ce-shu-yi-ge-pai-lie-jiu-xian/
    }
  }
  return res;
};
//因为我们不是找到一个解就完事,我们要找出所有满足条件的解。

//所以递归结束时,它是结束当前的递归分支,我们还要去别的分支继续搜。

//所以,我们要撤销当前的选择,回到选择前的状态,去选下一个选项,即切入下一个分支去搜索。

//退回来,把路走全了,才能在一棵空间树中,回溯出所有的解。


console.log(permute([1,2,3]));
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值