46:全排列:深度优先搜索

本文详细介绍了深度优先搜索(DFS)算法,包括其工作原理、递归和栈实现、适用场景如连通性检测和路径搜索,以及其可能的效率问题和局限性。同时提到了DFS在生成排列中的应用实例。
摘要由CSDN通过智能技术生成

算法思想:

深度优先搜索(Depth-First Search,DFS):深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树、图等数据结构的算法。它的基本思想是从起始节点开始,沿着一条路径不断深入地遍历,直到达到某个叶节点或无法继续深入为止,然后回溯到上一级节点,再继续探索其他路径。这种深入优先的搜索方式使得算法能够尽可能深入地探索一个分支,直到无法再深入为止,然后回溯到上一级节点,继续搜索其他分支。
深度优先搜索可以通过递归或栈来实现。以下是深度优先搜索的基本过程:

  1. 从起始节点开始遍历,将该节点标记为已访问。
  2. 访问当前节点的邻接节点中的一个未访问过的节点(如果有的话),并重复步骤1。
  3. 如果当前节点没有未访问过的邻接节点,回溯到上一级节点,继续访问其他未访问过的邻接节点。
  4. 重复步骤2和步骤3,直到所有节点都被访问过。

深度优先搜索适用于一些需要遍历或搜索所有可能情况的问题,例如图的连通性判断、路径搜索、拓扑排序等。然而,由于深度优先搜索会深入探索一个分支,可能会导致遍历的路径较长,因此在某些情况下可能会造成效率较低,或者需要使用剪枝等方法进行优化。

需要注意的是,深度优先搜索不一定能找到最优解,因为它可能会在一个分支中不断深入,而忽略了其他可能的解。在某些问题中,可能需要使用其他算法来保证找到最优解。

var permute = function (nums) {
  //创建返回值
  let result = [];
  //创建dfs函数
  function dfs(current) {
    if (current.length == nums.length) {
      result.push(current);
      return;
    }
    // nums.forEach((n) => {
    //判断,如果当前的current中已经包含了n,则跳过(forEach中的return不会停止后续循环的执行)
    //   if (current.includes(n)) return;
    //将当前的字符拼接到current的后面
    //   dfs(current.concat(n));
    // });

    // for循环内部的return直接终止整个函数的进行,可以用continue替代
    //遍历可能的选择或路径
    for (let i = 0; i < nums.length; i++) {
      //判断,如果当前的current中已经包含了n,则跳过
      if (current.includes(nums[i])) continue;
      //将当前的字符拼接到current的后面
      dfs(current.concat(nums[i]));
    }
  }

  dfs([]);
  console.log(result);
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值