js排列组合
2018-01-22 12:17 muamaker 阅读(849) 评论(0) 收藏 举报/*
全排列主要用到的是递归和数组的插入
arr: 需要排列的数组
第一步:从里面取一个,创建一个新的数组,形式为二维,例如arr = [1,2,3]; 取出3(没有特殊要求,随便取一个),放入 temp = [[3]],注意这里是二维数组,arr则为 arr=[1,2];
第二步: 从 arr逐一取出一个元素 currItem, 1
第三步:从 temp逐一 shift出一个元素,P这时的p为一个数组,[3];
第四步: 循环p数组,将currItem插入到p元素的各个位置得到 [1,3]和[3,1],并将结果加入到temp里面
第五步:取出arr中的2,重复三四步
*
* */
//方法二
function permutate(array/*需要进行全排列的一维数组*/, permutatedArray/*存放返回结果*/) {
if (!permutatedArray) {
permutatedArray = [];
}
if (array.length > 1) {
//弹出第一个数
var elementCur = array.shift();
//排列剩余的数组
permutate(array, permutatedArray);
//返回剩余的数组的排列长度
var permutatedArrayLen = permutatedArray.length;
//第一个数与其他剩余数组所有数组组合
for (var j = 0; j < permutatedArrayLen; j++) {
//弹出不齐的组
var p = permutatedArray.shift();
//把当前元素放到排列好的数组的所有位置
for (var i = 0; i <= p.length; i++) {
//复制排列好的数组
var r = p.slice(0);
//插入数据到数组的位置
r.splice(i, 0, elementCur);
//保存
permutatedArray.push(r)
}
}
//退出条件
} else {
permutatedArray.push([array[0]]);
}
return permutatedArray;
}
// a,b []
//方法一
function order(arr){
var permutatedArray = [];
if(arr.length > 1){
permutatedArray.push([arr.pop()]);
for(var i = 0; i < arr.length; i++){
var elementCur = arr[i];
var len = permutatedArray.length; //这里很关键,必须先取len,因为后面数组长度会变化
for(var j = 0; j < len; j++){
var p = permutatedArray.shift();
for(var n = 0; n <= p.length; n++){
//复制排列好的数组
var r = p.slice(0);
//插入数据到数组的位置
r.splice(n, 0, elementCur);
//保存
permutatedArray.push(r)
}
}
}
}else{
return permutatedArray.push([array[0]]);
}
return permutatedArray;
}
//permutate
console.log(order(["a","b","c"]));
console.log(permutate(["a","b","c"]));
解法三、
简单的回溯法:
var permute = function(nums) {
let res = [];
let len = nums.length;
function back(path){
if(path.length > len){
return ;
}
if(path.length === len){
res.push(path.slice(0));
return ;
}
for(let i = 0; i < len; i++){
if(path.indexOf(nums[i]) === -1){
path.push(nums[i]);
back(path);
path.pop();
}
}
}
back([],0);
return res;
};
console.log(permute([1,2,3]))
浙公网安备 33010602011771号