解决思路
回溯+剪枝
class Solution { public List<List<Integer>> subsetsWithDup(int[] nums) { List<List<Integer>> res = new ArrayList<>(); if (nums == null || nums.length == 0) return res; //先排序 Arrays.sort(nums); backtrack(0,nums,res,new ArrayDeque<>()); return res; } private void backtrack(int begin,int[] nums,List<List<Integer>> res,Deque<Integer> temp){ res.add(new ArrayList<>(temp)); for (int i = begin;i < nums.length;i++){ //剪枝 if (i > begin && nums[i] == nums[i - 1]) continue; temp.addLast(nums[i]); backtrack(i + 1,nums,res,temp); temp.removeLast(); } }}