1. 程式人生 > >LeetCode 第46,47題(Permutations)Java

LeetCode 第46,47題(Permutations)Java

原題: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去除重複的部分實際上是剪枝,將搜尋樹中一些值去除,不進行計算;