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]));