給定一個沒有重復數字的序列,返回其所有可能的全排列。
示例:
輸入: [1,2,3]
輸出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
看到這個題目,我們應該有這樣的思路:
比如就如題【1,2,3】,我們來分析:
1.定1,來求2,3的全排列
1.1.定2,來求3的全排列
1.1.1.只有3了。所以得到的答案為【1,2,3】
1.2回到剛剛的2,3全排列,因為3排了,2沒有變,所以此時2不得不變,得到的答案是【1,3,2】
2.定1已經完了,這時候1不得不變了,所以定2,求1,3的全排列
2.1.定1,來求3的全排列
2.1.1.只有3了。所以得到的答案為【2,1,3】
2.2回到剛剛的1,3全排列,因為3排了,1沒有變,所以此時1不得不變,得到的答案是【2,3,1】
2.定1,2已經完了,這時候1,2不得不變了,所以定3,求1,2的全排列
2.1.定1,來求2的全排列
2.1.1.只有2了。所以得到的答案為【3,1,2】
2.2回到剛剛的1,2全排列,因為2排了,1沒有變,所以此時1不得不變,得到的答案是【3,1,2】
因此最后的答案是【1,2,3】 【1,3,2】 【2,1,3】 【2,3,1】 【3,1,2】 【3,1,2】
我們可以再來一個復雜的例子:
比如:[1,2,4,5]我們要求它的全排列,分析如下:
1.定1,來求2,4,5的全排列
1.1.定2,來求4,5的全排列
1.1.1.定4,求5的全排列,
1.1.1.1只有5了。所以得出【1,2,4,5】
1.1.2回到剛才的保持2不變,求4,5的排列。因為4不變過,所以4不能打頭了。故結果為【1,2,5,4】
1.2.等到2以后的都排列完了后,2不得不變,所以定4,求2,5的全排列
1.2.1.保持2不變,求5的全排列
1.2.1.1.只有4了。所以得出【1,4,2,5】
1.2.2回到剛才的保持4不變,求2,5的排列。因為2不變過,所以2不能打頭了。故結果為【1,4,5,2】
1.3.等到2.4都定完了后,2,4不得不變,所以定5,求2,4的全排列
1.2.1.保持2不變,求4的全排列
1.2.1.1.只有4了。所以得出【1,5,2,4】
1.2.2回到剛才的保持5不變,求2,4的排列。因為4不變過,所以4不能打了。故結果為【1,5,4,2】
..............
所以以第一個打頭的有 【1,2,4,5】 【1,2,5,4】 【1,4,2,5】 【1,4,5,2】 【1,5,2,4】 【1,5,4,2】
這只是定第一個數字的情況,其他的和這個類似,就不多寫重復的思路了。 ...........
具體的實現代碼如下:
package edu.ymm.about_permutation; import java.util.ArrayList; import java.util.List; public class Permutation { static List<List<Integer>> lists=new ArrayList<>(); public static List<List<Integer>> permute(int[] nums) { List<Integer> list=new ArrayList<>(); if(nums.length==0||nums==null){ return lists; } permute(nums,list,0); return lists; } private static void permute(int[] nums, List<Integer> list, int index) { //邊界值判斷 if(index==nums.length){ lists.add(new ArrayList<>(list)); return; } //i是從開始 i=index ;swap(,i)index相當於固定當前位置,在進行下一位的排列。 for(int i=index;i<nums.length;i++){ swap(nums,index,i); //第一次交換定點之后的 list.add(nums[index]); //把找到的加進去 permute(nums,list,index+1); //進行遞歸 list.remove(list.size()-1); //其中定位定完的需要定后面的數據 swap(nums,index,i); //這是交換定點的,也就是重新返回上一級進行交換 } } private static void swap(int[] nums, int index, int i) { int t =nums[index]; nums[index] = nums[i]; nums[i] = t; } public static void main(String[] args){ int[] nums=new int[]{1,2,3}; List<List<Integer>> lists=new ArrayList<>(); lists=permute(nums); for(List<Integer> list:lists){ for(int i:list){ System.out.print(i+" "); } System.out.println(); } } }
執行結果為: