目录
一、题目描述
二、整体思路
和上一道Leetcode46相比,有变化的地方是要排除重复组合的情况。那么在组合问题中去除重复组合的方法是先对数组进行排序,然后在回溯函数中判断当前元素与上一个元素是否相同,若相同则直接访问下一个元素。在全排列问题中要稍微改一下。
以{1,1,2}为例
三、代码
class Solution {
List<List<Integer>> res=new ArrayList<>();
List<Integer> temp=new ArrayList<>();
public List<List<Integer>> permuteUnique(int[] nums) {
boolean[] visited=new boolean[nums.length];
Arrays.sort(nums);
backtrace(visited,nums);
return res;
}
void backtrace(boolean[] visited,int[] nums){
if(temp.size()==nums.length){
res.add(new ArrayList<>(temp));
}
for(int i=0;i<nums.length;i++){
if(i>0 && visited[i-1]!=true && nums[i]==nums[i-1]){
continue;
}
if(visited[i]){
continue;
}
temp.add(nums[i]);
visited[i]=true;
backtrace(visited,nums);
visited[i]=false;
temp.remove(temp.size()-1);
}
}
}