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
---------------------