地址:
题目:
给定一个含有不同数字的集合,返回所有可能的全排列。
比如,[1,2,3]
具有如下排列:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]复制代码
分析:
这个题为中等难度,我在参考网上一些答案之后才有思路,不得不说自己算法水平还是太渣?
这种全排列题是典型的穷举法,显然穷举法一般用递归来解。所以这道题我是用递归+添加,因为数组中元素各不相同,所以可以在递归函数里遍历所有位置,但是如果有相同元素,这种方法就行不通了。。
其实原理很简单,就是每个递归取最后一个元素添加到前面元素组成的数组的每一个位置,前端开发用到递归的地方还是太少,所以递归对我来说还是有些难度的。。好了,该上代码了~
答案:
/**
* @param {number[]} nums
* @return {number[][]}
*/
var permute = function(nums) {
var len = nums.length;
return perm(len - 1);
function perm(i) {
if (i == 0) {
return [[nums[0]]];
} else if (i == 1) {
return [[nums[0], nums[1]], [nums[1], nums[0]]]; // 代码运行到此处跳出递归
}
var ans1 = perm(i -1);
var size = ans1.length;
var ans2 = [];
var fixNum = nums[i];
for (var k = 0; k < size; k++) {
for (var l = 0; l <= i; l++) {
var arr = ans1[k].slice(); // 复制数组
arr.splice(l, 0, fixNum); // 在这个数组每一个位置添加fixNum
ans2.push(arr);
}
}
return ans2;
}
};
复制代码
我是月铭泽,欢迎各位童鞋交流指正^_^