1. 程式人生 > >46 Permutations && 47 Permutation II (Array, DFS)

46 Permutations && 47 Permutation II (Array, DFS)

78 Permutation I

Given a collection of 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].

和上次的Subset有什麼不同呢?

1. 新增進res的時間,上面題我們每新增一個數字到tmp裡,就可以往res裡面新增,而這次,我們要生成完整的序列,所以需要當tmp.size()==序列長度的時候再往res裡面新增

2. 每次不能從pos開始往陣列尾巴掃了,因為我們要求的不是Subset而是完整序列,所以要從第一個數字開始往陣列尾巴掃,問題又來了,我們怎麼知道取沒取過這個元素呢,那麼我們就建立一個boolean[] visit 每此新增的時候給相對應位置置True,刪去的時候置False
 

public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        if(nums==null || nums.length==0)
            return res;
        Arrays.sort(nums);
        boolean[] visit = new boolean[nums.length];
        List<Integer> tmp = new ArrayList<Integer>();
        doPermutation(nums,visit,tmp,res);
        return res;    
}
    private void doPermutation(int[] nums,boolean[] visit,List<Integer> tmp,List<List<Integer>> res){
        if(tmp.size()==nums.length){
            res.add(new ArrayList<>(tmp));
            return;//注意回溯
        }
        for(int i=0;i<nums.length;i++){
            if(visit[i]==false){
                tmp.add(nums[i]);
                visit[i] = true;
                doPermutation(nums,visit,tmp,res);
                tmp.remove(tmp.size()-1);
                visit[i] = false;
            }
        }
    }

47. Permutations II

Given a collection of numbers that might contain duplicates, return all possible unique permutations.

Example:

Input: [1,1,2]
Output:
[
  [1,1,2],
  [1,2,1],
  [2,1,1]
]

思路:

這道題和上一道區別就是有重複的數字,如果方法不變話,就會重複:

[1,1,2],[1,2,1],[1,2,1][1,1,2][2,1,1],[2,1,1]

所以首先對陣列排序,讓相同的元素挨著,然後迴圈裡面判斷一下如果和之前的元素相同就跳過這次。

public List<List<Integer>> permuteUnique(int[] nums) {
         List<List<Integer>> res = new ArrayList<>();
        if(nums==null || nums.length==0)
            return res;
        Arrays.sort(nums);//注意要排序!!
        boolean[] visit = new boolean[nums.length];
        List<Integer> tmp = new ArrayList<Integer>();
        doPermutation(nums,visit,tmp,res);
        return res;
    }

     private void doPermutation(int[] nums,boolean[] visit,List<Integer> tmp,List<List<Integer>> res){
        if(tmp.size()==nums.length){
            res.add(new ArrayList<>(tmp));
            return; 
        }
        for(int i=0;i<nums.length;i++){
            if(visit[i]==false){
                tmp.add(nums[i]);
                visit[i] = true;
                doPermutation(nums,visit,tmp,res);
                tmp.remove(tmp.size()-1);
                visit[i] = false;
                while(i<nums.length-1 && nums[i]==nums[i+1])
                    i++;//關鍵的部分
            }
        }
    }

--------------------- 
refer:https://blog.csdn.net/u011095253/article/details/9158403 

---------------------