class Solution {
public List<List<Integer>> subsetsWithDup(int[] nums) {
//创建结果数组
List<List<Integer>> ans = new ArrayList<>();
//不重复问题一般先排序
Arrays.sort(nums);
//调用回溯
backtrack(0,nums,ans,new ArrayList<>());
return ans;
}
//回溯方法
private void backtrack(int start,int[] nums,List<List<Integer>> ans,ArrayList<Integer> track){
//满足条件
ans.add(new ArrayList<Integer>(track));
//选择列表
for(int i = start;i<nums.length;i++){
//去重
if(i>start && nums[i]==nums[i-1]) continue;
//做选择
track.add(nums[i]);
//回溯
backtrack(i+1,nums,ans,track);
//撤销选择
track.remove(track.size()-1);
}
}
}