LeetCode 第46,47題(Permutations)Java
阿新 • • 發佈:2019-01-22
原題:Given a collection of distinct numbers, return all possible permutations.
第四十六題允許重複,四十七題不允許;
在解法上有相似的地方;
思路:這道全排列問題可以遞迴地去做,先確定一個值,對剩下的進行遞迴;
實際上是一道關於深度優先搜尋演算法的題目;
參考了這一篇部落格:http://blog.csdn.net/chenchaofuck1/article/details/51194976
程式碼:
public class Solution { public List<List<Integer>> permuteUnique(int[] nums) { List<List<Integer>> allLists=new LinkedList<>(); dfs(allLists,nums,0); return allLists; } void dfs(List<List<Integer>> Lists,int[] nums,int s){ if(s==nums.length){ List<Integer> list=new LinkedList<>(); for(int i=0;i<nums.length;i++){ //將一個排好序的序列儲存起來; list.add(nums[i]); } Lists.add(list); }else{ for(int i=s;i<nums.length;i++){ boolean flag=false; //flag部分針對47題,在元素出現重複時不進行交換; for(int j=s;j<i;j++){ // if(nums[j]==nums[i]){ // flag=true; // } // } // if(flag){ // continue; // } // //交換兩數字順序; int tmp=nums[s]; nums[s]=nums[i]; nums[i]=tmp; dfs(Lists,nums,s+1); //交換回來; nums[i]=nums[s]; nums[s]=tmp; } } } }
利用flag去除重複的部分實際上是剪枝,將搜尋樹中一些值去除,不進行計算;