给定一个没有重复数字的序列,返回它所有可能的完全排列。示例:输入:[1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]这道题是回溯算法的经典应用场景1.算法策略回溯算法是一种搜索法,启发式方法,每一步都会做出选择,一旦发现这个choicecannotobtained期待结果,回去重新做选择。深度优先搜索利用了回溯算法的思想。2.适用场景回溯算法非常简单,就是不断尝试,直到得到解。它的算法思想使其通常用于解决广度搜索问题,即从一组可能的解中选择满足要求的解。3、代码实现,我们可以写出数组[1,2,3]的全排列:先写出从1开始的全排列,它们是:[1,2,3],[1,3,2],即1+[2,3]的全排列;然后写出从2开始的全排列,它们是:[2,1,3],[2,3,1],即全排列2+[1,3]Permutation;最后写出从3开始的全排列,它们是:[3,1,2],[3,2,1],即3+[1,2]的全排列。即回溯的处理思路有点类似于枚举查找。我们枚举所有的解决方案,找到满足期望的那个。为了有规律地列举出所有可能的解法,避免遗漏和重复,我们将解题过程分为多个阶段。在每个阶段,我们都会面临一个岔路口。我们首先随机选择一条道路。当我们发现这条路走不通时(解决方案不符合预期),我们会回到之前的岔路口,选择另一条。要走的路就是继续走下去。这显然是一个递归结构;递归的终止条件是:一个序列中已经选择了足够多的数,所以我们需要一个变量来表示当前程序递归到哪一层,我们称这个变量为depth,或者命名为index,表示当前要确定的是什么是某个全排列中带有下标索引的数;used(object):用于表示一个数是否被选中,如果这个数(num)被选中,则设置为used[num]=true,这样在考虑下一个位置的时候,可以判断这个数是否已经被选中具有O(1)的时间复杂度,这是一种“以空间换时间”的思想。letpermute=function(nums){//用数组保存所有可能的全排列letres=[]if(nums.length===0){returnres}letused={},path=[]dfs(nums,nums.length,0,path,used,res)returnres}letdfs=function(nums,len,depth,path,used,res){//所有数字都填上if(depth===len){res.push([...path])return}for(leti=0;i
