【leetcode】46. (Medium )Permutations
阿新 • • 發佈:2018-11-10
解題思路:
這道題的意思就是給你一組數,其中的數字都不一樣,然後求這些數字所有的全排列組合。
比較簡單的思路是:
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;
}
}
執行結果: