题目描述
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
思路:
类似与全排列,只是这里使用了set来判断是否重复,使用了一个visit数组,用于表示是否已经使用过了
代码:
class Solution {
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
int visit[] = new int[nums.length];
List<Integer> size = new ArrayList<>();
Set<List<Integer>> temset= new HashSet<>();
permuteinUnie(nums, size, visit, result,temset);
return result;
}
public void permuteinUnie(int nums[],List<Integer> size,int []visit ,List<List<Integer>> result,Set<List<Integer>> temset){
if(size.size() == nums.length){
List<Integer> temsIntegers = new ArrayList<>(size);
int size1 = temset.size();
temset.add(temsIntegers);
if( temset.size() > size1){
result.add(temsIntegers);
return;
}else {
return;
}
}
for (int i = 0; i < nums.length; i++) {
if(visit[i] == 0){
visit[i] = 1;
size.add(nums[i]);
permuteinUnie(nums, size, visit, result,temset);
size.remove(size.size() - 1);
visit[i] = 0;
}
}
}
}
排名靠前的代码
这个类似于剑指offer的那个算法
class Solution {
public List<List<Integer>> permuteUnique(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> result = new ArrayList<>();
traceback(nums,0,nums.length-1,result);
return result;
}
private void traceback(int[] nums, int start, int length, List<List<Integer>> res) {
if (start==length){
List<Integer> item = new ArrayList<>();
for (int num:nums) {
item.add(num);
}
res.add(item);
return;
}
for (int i = start; i <=length; i++) {
if(isDuplicate(nums,start,i)){
swap(nums,start,i);
traceback(nums,start+1,length,res);
swap(nums,start,i);
}
}
}
private boolean isDuplicate(int[] nums, int start, int end) {
for (int j = start; j <end; j++) {
if (nums[j]==nums[end]){
return false;
}
}
return true;
}
private void swap(int[] nums, int i, int start) {
int temp = nums[i];
nums[i] = nums[start];
nums[start] = temp;
}
}