给定一个可包含重复数字的序列
nums
,按任意顺序 返回所有不重复的全排列。输入:nums = [1,1,2] 输出: [[1,1,2], [1,2,1], [2,1,1]]
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
class Solution {
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
int[] used = new int[nums.length];
Arrays.sort(nums);
order(res,nums,new ArrayList<Integer>(),used);
return res;
}
public void order(List<List<Integer>> res, int[] nums, ArrayList<Integer> tmp, int[] used) {
if(tmp.size() == nums.length){
res.add(new ArrayList(tmp));
return;
}
for(int i = 0;i < nums.length;i++){
//nums[i] == nums[i-1] && used[i-1]==0 实现去重,重复元素中从非第一个访问时需要跳过,因为访问肯定会重复了
if(used[i] == 1 || (i > 0 && nums[i] == nums[i-1] && used[i-1] == 0)){
continue;
}
used[i] = 1;
tmp.add(nums[i]);
order(res,nums,tmp,used);
used[i] = 0;
tmp.remove(tmp.size() - 1);
}
}
}
使用Deque<Integer> = new ArrayDeque<>(); 用数组实现的双端队列来实现
class Solution {
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
if(nums.length == 0){
return res;
}
boolean[] used = new boolean[nums.length];
Arrays.sort(nums);
Deque<Integer> path = new ArrayDeque<>();
order(res,nums,path,used);
return res;
}
private void order(List<List<Integer>> res,int[] nums,Deque<Integer> path,boolean[] used){
if(path.size() == nums.length){
res.add(new ArrayList(path));
return;
}
for(int i = 0; i < nums.length;i++){
if(used[i] || (i > 0 && nums[i] == nums[i-1] && !used[i-1])){
continue;
}
path.addLast(nums[i]);
used[i] = true;
order(res,nums,path,used);
path.removeLast();
used[i] = false;
}
}
}