class Solution {
List<List<Integer>> result = new ArrayList<List<Integer>>();
List<Integer> temp = new ArrayList<>();
boolean[] used;//记录下标重复
public void back(int[] nums){
if(temp.size()==nums.length){
result.add(new ArrayList<>(temp));
return;
}
int[] values = new int[21];//记录值重复
for(int i=0;i<nums.length;i++){
if(values[nums[i]+10]==1 || used[i]){
continue;
}
values[nums[i]+10] = 1;
used[i]=true;
temp.add(nums[i]);
back(nums);
used[i]=false;
temp.remove(temp.size()-1);
}
}
public List<List<Integer>> permuteUnique(int[] nums) {
Arrays.sort(nums);
used = new boolean[nums.length];
back(nums);
return result;
}
}
当遇到组合要避免值重复时,使用values内部数组值记录 ,当遇到全排列防止下标重复时用used外部数组记录。