题目链接:https://leetcode-cn.com/problems/permutations/submissions/
回溯大法好啊! 我还用了标记数组,回溯完记得恢复原状
/**
* @param {number[]} nums
* @return {number[][]}
*/
var permute = function(nums) {
let ans = [] //存放所有的排列结果
let temp = [] //存放每一次的排列数据
let len = nums.length
let used = new Array(len).fill(0); //初始化全0数组,访问标记数组
backtrack()
return ans;
function backtrack(){
if(temp.length === len){
// console.log(temp);
ans.push([...temp]) //需要拷贝temp,不然指向的永远都是同一个数组引用
// console.log('ans' , ans);
return
}
for(let i = 0;i < len;i++){
if(used[i] === 1) continue;
temp.push(nums[i])
used[i] = 1;
backtrack()
temp.pop()
used[i] = 0;
}
}
};
遇到一个小坑:
往ans数组里面push数组,我直接push了temp,结果为全空
后来输出每一步的ans,才发现问题,数组是引用类型,所以每次push的都是一个指向,而他们指向为同一个数组,需要对数组进行拷贝一下