1. 程式人生 > >leetcode-46-全排列(permutations)-java

leetcode-46-全排列(permutations)-java

題目及測試

package pid046;

import java.util.List;

/*全排列

給定一個沒有重複數字的序列,返回其所有可能的全排列。

示例:

輸入: [1,2,3]
輸出:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]


*/
public class main {
	
	public static void main(String[] args) {
		int[] testTable=new int[]{1,2,3,4};
		test(testTable);
		
		
	}
		 
	private static void test(int[] ito) {
		Solution solution = new Solution();
		int length=ito.length;
		List<List<Integer>> rtn;
		for(int i=0;i<length;i++){
			System.out.print( ito[i]+"  ");			
		}
		System.out.println();
		long begin = System.currentTimeMillis();
		rtn=solution.permute(ito);//執行程式
		long end = System.currentTimeMillis();		
		
		for(int i=0;i<rtn.size();i++){			
			for(int j=0;j<rtn.get(i).size();j++){
				System.out.print( rtn.get(i).get(j)+"  ");
			}
			System.out.println();
		}
		
		System.out.println();
		System.out.println("耗時:" + (end - begin) + "ms");
		System.out.println("-------------------");
	}

}

解法1(成功,8ms,較慢)

在類中建立一個result的變數,放置結果
建立permutateRemain函式,變數為上一次的全排列幾位的list(now)和還能排的數字的list(remain)
在函式中,
如果remain剩餘的量為0,將now加入result
對remain進行遍歷,在遍歷中
遍歷的數字為now
先建立一個對now的copy newlist,將newlist加入now
然後將remain除去now,進行新的permutateRemain,然後在remain重新加入now,結束遍歷

package pid046;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

public class Solution {
	List<List<Integer>> result=new ArrayList<>();
	
	public List<List<Integer>> permute(int[] nums) {
		int length=nums.length;
		if(length==0){
			return result;
		}
	    List<Integer> now=new ArrayList<>();
	    List<Integer> remain=new ArrayList<>(nums.length);
	    for(int num:nums){
	    	remain.add(num);
	    }
		permuteRemain(now,remain);		
		return result;
	}
	
	public void permuteRemain(List<Integer> now,List<Integer> remain){
		if(remain.size()==0){
			result.add(now);
			return;
		}
		List<Integer> newList;
		for(int i=0;i<remain.size();i++){
			Integer num=remain.get(i);
			remain.remove(i);
			newList=new ArrayList<>();
			newList.addAll(now);
			newList.add(num);
			permuteRemain(newList, remain);
			remain.add(i, num);
		}
		
	}
	
}

解法2(別人的)

省去了不斷copy list的時間,加了判斷now有無這個num的時間

package go.jacob.day819;
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
 
/**
 * 46. Permutations
 * @author Jacob
 * 題意:求陣列的全排列
 */
public class Demo1 {
	List<List<Integer>> res;
 
	public List<List<Integer>> permute(int[] nums) {
		res = new ArrayList<List<Integer>>();
		if (nums == null || nums.length < 1)
			return res;
		//對陣列元素進行從小到大排序
		Arrays.sort(nums);
		ArrayList<Integer> list = new ArrayList<Integer>();
 
		solve(list, nums);
 
		return res;
	}
 
	private void solve(ArrayList<Integer> list, int[] nums) {
		if (list.size() == nums.length) {
			res.add(new ArrayList<Integer>(list));
			return;
		}
		for (int i = 0; i < nums.length; i++) {
			if (!list.contains(nums[i])) {
				list.add(nums[i]);
				solve(list, nums);
				list.remove(list.size() - 1);
			}
		}
	}
}

解法3,解法4

字典序 的非遞迴全排列

遞迴的交換全排列

http://www.cnblogs.com/pmars/archive/2013/12/04/3458289.html

https://segmentfault.com/a/1190000007067885