代码改变世界

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]))