leetcode no 47 permutations ii

1. 题目

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

2. 思路

和前一题思路一样,只不过要判断一下是否重复。

2.1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class  {
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
if(nums.length == 0){
return result;
}
Arrays.sort(nums);
List<Integer> temp = new ArrayList<Integer>();
dfs(result, temp, nums, new boolean[nums.length]);
return result;
}
public void dfs(List<List<Integer>> result, List<Integer> temp, int[] nums, boolean[] used){
if(temp.size() == nums.length){
result.add(new ArrayList<Integer>(temp));
return;
}
for(int i=0; i<nums.length; i++){
if(used[i] || i > 0 && nums[i] == nums[i-1] && !used[i - 1]) continue;
used[i] = true;
temp.add(nums[i]);
dfs(result, temp, nums, used);
used[i] = false;
temp.remove(temp.size() - 1);
}
}
}

2.2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class  {
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
if(nums.length == 0){
return result;
}
dfs(result, nums, 0);
return result;
}
public void dfs(List<List<Integer>> result, int[] nums, int index){
if (index == nums.length-1) {
List<Integer> subList = new ArrayList<Integer>();
for (int i = 0; i < nums.length; i++) {
subList.add(nums[i]);
}
result.add(subList);
return;
}
for (int i = index; i < nums.length; i++) {
boolean flag=false;
for(int j=index;j<i;j++){
if(nums[j]==nums[i])
flag=true;
}
if(flag) continue;
int temp = nums[index];
nums[index] = nums[i];
nums[i] = temp;
dfs(result, nums, index+1);
nums[i] = nums[index];
nums[index] = temp;
}

}
}