1. 程式人生 > >Leetcode 46 Permutations 全排列,給定不重複的幾個數字,輸出他們所有的排列

Leetcode 46 Permutations 全排列,給定不重複的幾個數字,輸出他們所有的排列

這道題的最簡單的思路就是,我後面的在前面的基礎上,從左到右依次換位置插入。

題目:

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

示例:

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

我的較笨解決辦法:

package test;

import java.util.ArrayList;
import java.util.List;

public class LC46Try1
{
	public List<List<Integer>> permute(int[] nums)
	{
		List<List<Integer>> ret = new ArrayList<List<Integer>>();
		int len=nums.length;
		if(len==0){
			return ret;
		}
		List<Integer> list=new ArrayList<Integer>();
		list.add(nums[0]);
		ret.add(list);
		
		for(int i=1;i<len;i++){
			int t=nums[i];
			List<List<Integer>> temp = new ArrayList<List<Integer>>();
			for(int j=0;j<ret.size();j++){
				List<Integer> tlist=ret.get(j);
				for(int k=0;k<=tlist.size();k++){
					List<Integer> lt=new ArrayList<Integer>(tlist);
					lt.add(k, t);
					temp.add(lt);
				}
			}
			ret=temp;
		}
		return ret;
	}
	public static void main(String[] args)
	{
		LC46Try1 t = new LC46Try1();
		int[] nums={1,2,3};
		System.out.println(t.permute(nums));
	}

}


較好的解決辦法:

package test;

import java.util.ArrayList;
import java.util.List;



public class LC46Try2
{
	public List<List<Integer>> permute(int[] nums)
	{
		List<List<Integer>> result = new ArrayList<List<Integer>>();
		List<Integer> list=new ArrayList<Integer>();
		backtracking(result, list, nums, 0);
		return result;
	}

	private void backtracking(List<List<Integer>> result, List<Integer> temp,
			int[] nums, int index)
	{
		 if (index==nums.length){
	        	result.add(new ArrayList<Integer>(temp));
	            return;
	        }
	        //就相當於最後一個for迴圈,時間可能短在 list的複製上
	        for (int i=0; i<=index; i++){
	            temp.add (i, nums[index]);
	            backtracking (result, temp, nums, index+1);           
	            temp.remove (i);
	        }
		
	}

	
}

哈哈