1. 程式人生 > >【leetcode】46. (Medium )Permutations

【leetcode】46. (Medium )Permutations

題目連結


解題思路:
這道題的意思就是給你一組數,其中的數字都不一樣,然後求這些數字所有的全排列組合。

比較簡單的思路是:
1.首先如果陣列中只有一個數比如2,那就只返回這個數構成的全排列;

2.如果有兩個數比如1,2那先求2全排列,可以得到[[2]],
然後在這些子全排列(這裡就只有一個)的中間插入1,得到[1][2]和[2][1];

3.如果有三個數比如1,2,3,那就先求2、3能構成的所有子全排列,再在這些子全排列中插入1,
這裡2,3能構成的全排列為[2][3]和[3][2],
先在[2][3]中插入1,可以得到[1][2][3]、[2][1][3]、[2][3][1],
然後在第二個全排列中插入1,可以得到[1][3][2],[3][1][2],[3][2][1]

可以從上面的過程看出這是一個遞迴的過程,要求n個數的所有全排列,首先利用這個函式本身求得n-1個數所有子全排列組合,然後在每個子全排列中插入剩下的一個數字,就可以得到這n個數的所有全排列了。

提交程式碼:

class Solution{
	 public List<List<Integer>> permute(int[] nums) {
		 //return current permutation
		 List<List<Integer>> lists=new ArrayList<List<Integer>>
(); if(nums==null||nums.length==0) return lists; if(nums.length==1) { List<Integer> list=new ArrayList<Integer>(); list.add(nums[0]); lists.add(list); return lists; } int basenums[]=new int[nums.length-1]; for(int i=0,j=1;j<
nums.length;) basenums[i++]=nums[j++]; List<List<Integer>> baselists=permute(basenums); int prelistslen=baselists.size(); for(int listcnt=0;listcnt<prelistslen;listcnt++) { List<Integer> baselist=new ArrayList<Integer>(); baselist=baselists.get(listcnt); int listsize=baselist.size(); for(int i=0;i<=listsize;i++) { List<Integer> list=new ArrayList<Integer>(); for(int j=0;j<baselist.size();j++) list.add(baselist.get(j)); list.add(i, nums[0]); lists.add(list); } } return lists; } }

執行結果:
在這裡插入圖片描述