標籤:
Given a collection of distinct numbers, return all possible permutations.
For example,
[1,2,3] have the following permutations:
[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], and [3,2,1].
這其實是一個全排列問題。具有較強的普遍性
一開始自己想了個辦法,但是這個辦法每次迴圈都要產生一個ArrayList標記已經訪問的位置,對於空間的浪費特別大。
遂在網上尋找更優的辦法。該辦法的核心思想就是:
全排列就是從第一個數字起每個數分別與它後面的數字交換。
public class Solution2 { /** * @param args */ public List<List<Integer>> permuteUnique(int[] nums) { ArrayList<List<Integer>> pool=new ArrayList<List<Integer>>(); f(nums,0,pool); return pool; } public void f(int [] nums,int current,ArrayList<List<Integer>> pool) { if(current==nums.length) { ArrayList<Integer> tmp=new ArrayList<Integer>(); for(int n:nums) { tmp.add(n); } pool.add(tmp); } for(int i=current;i<nums.length;i++) { swap(nums,current,i); f(nums,current+1,pool); swap(nums,current,i); } } public void swap(int []nums,int i,int j) { int tmp=nums[j]; nums[j]=nums[i]; nums[i]=tmp; } }
顯然,該代碼的核心部分是for迴圈。
第一個swap交換元素,第二個swap的用意在於將交換過的元素再交換回來,保證數組的不變。
leetcode permutations(全排列)