题目描述:
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;
}
}
}
}