法1:回溯
想法:
- 将访问到的数字加入临时数组temp
- 继续访问nums中的数字,不在temp中的可加入(加入了temp相当于做了标记)
- 尝试了各种陆续将各个数字加入temp的方式,且temp中数字无重复,各种方式得到的答案即为题目所求
注:当前循环中,这一轮没有加入的数字,下一轮可能还会加入;或在调用的函数的循环中有可能加入,可以覆盖所有的情况
/**
* @param {number[]} nums
* @return {number[][]}
*/
var permute = function(nums) {
if(nums.length <= 1) {
return [nums];
}
var temp = [], output = [];
doPermute(nums, temp, output);
return output;
};
function doPermute(nums, temp, output) {
if(temp.length == nums.length) {
// 需要创建temp副本,再加入output,
//否则最后output中都是同一个temp,
//且temp保留的是其最终状态[]
var tmp = temp.concat([]);
output.push(tmp);
return;
}
var i = 0;
for(i = 0; i < nums.length; i++) {
if(temp.indexOf(nums[i]) < 0) {
temp.push(nums[i]);
doPermute(nums, temp, output);
temp.pop();
}
}
}