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], [2,1,1] ]
考虑重复的全排列,需要对重复的部分进行判断。
避免重复的思路有俩,第一个是加入list的时候判断一下,第二个就是在生成的时候判断
比如相同的两个1. 1 1 强行要求第一个1必须在第二个1 的前面。也就是第一个还没有visited的时候,第二个就不能visted
public class Solution {
public List<List<Integer>> permuteUnique(int[] num) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
ArrayList<Integer> list = new ArrayList<Integer>();
int[] visited = new int[num.length];
Arrays.sort(num);//注意,要先给元素排序
helper(result, list, visited, num);
return result;
}
public void helper(List<List<Integer>> result, List<Integer> list, int[] visited, int[] num) {
if(list.size() == num.length)
result.add(new ArrayList<Integer>(list));
for(int i = 0; i < num.length; i++) {
if (visited[i] == 1 || (i != 0 && num[i] == num[i - 1] && visited[i - 1] == 0))
continue;
visited[i] = 1;
list.add(num[i]);
helper(result, list, visited, num);
list.remove(list.size() - 1);
visited[i] = 0;
}
}
}
= = 超时了= = =
public class Solution {
public List<List<Integer>> permuteUnique(int[] num) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
ArrayList<Integer> list = new ArrayList<Integer>();
int[] visited = new int[num.length];
Arrays.sort(num);//注意,要先给元素排序
helper(result, list, visited, num);
return result;
}
public void helper(List<List<Integer>> result, List<Integer> list, int[] visited, int[] num) {
if(list.size() == num.length) {
int falg = 0;
for(List<Integer> l : result){
if(l.equals(list)){
falg = 1;
break;
}
}
if(falg == 0)
result.add(new ArrayList<Integer>(list));
}
for(int i = 0; i < num.length; i++) {
if (visited[i] == 1)
continue;
visited[i] = 1;
list.add(num[i]);
helper(result, list, visited, num);
list.remove(list.size() - 1);
visited[i] = 0;
}
}
}