算法思想:
深度优先搜索(Depth-First Search,DFS)
:深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树、图等数据结构的算法。它的基本思想是从起始节点开始,沿着一条路径不断深入地遍历,直到达到某个叶节点或无法继续深入为止,然后回溯到上一级节点,再继续探索其他路径。这种深入优先的搜索方式使得算法能够尽可能深入地探索一个分支,直到无法再深入为止,然后回溯到上一级节点,继续搜索其他分支。
深度优先搜索可以通过递归或栈来实现。以下是深度优先搜索的基本过程:
- 从起始节点开始遍历,将该节点标记为已访问。
- 访问当前节点的邻接节点中的一个未访问过的节点(如果有的话),并重复步骤1。
- 如果当前节点没有未访问过的邻接节点,回溯到上一级节点,继续访问其他未访问过的邻接节点。
- 重复步骤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]);