題目描述:
Given a collection of numbers that might contain duplicates, return all possible unique permutations.
For example,
[1,1,2]have the following unique permutations:
[1,1,2],[1,2,1], and[2,1,1].
思路解析:
- 這個題需要在全排列的基礎上,判斷是不是重複的,注意首先把數組從小到大排列一下,這樣重複的都相鄰了
- 然後需要做的就是在num[i-1]==num[i]的情況下,還有就是它沒有訪問過。這時候就會出現重複的結果,直接跳過。
代碼:
import java.util.*;
public class Solution {
public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> item = new ArrayList<Integer>();
if(num==null || num.length==0){
return res;
}
boolean[] visited = new boolean[num.length];
Arrays.sort(num);
helper(res,item,visited,num);
return res;
}
private void helper(ArrayList<ArrayList<Integer>> res,ArrayList<Integer> item,boolean[] visited,int[] num){
if(item.size() == num.length){
res.add(new ArrayList<Integer>(item));
return;
}
for(int i=0;i<num.length;i++){
if(i>0 &&num[i-1] == num[i]&&!visited[i-1]){
continue;
}
if(!visited[i]){
item.add(num[i]);
visited[i]=true;
helper(res,item,visited,num);
item.remove(item.size()-1);
visited[i]=false;
}
}
}
}