leetcode 题目链接
1. 题目考点
- dfs 回溯 + 剪枝
2. 考点解析
数组重复必定先排序
不重复自身必有start
解集不重复必有used
class Solution {
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> subsetsWithDup(int[] nums) {
Stack<Integer> path = new Stack<>();
Arrays.sort(nums);
boolean[] used = new boolean[nums.length];
dfs(0, nums, path, used);
return res;
}
public void dfs(int start, int[] nums, Stack<Integer> path, boolean[] used) {
res.add(new ArrayList(path));
for (int i = start; i < nums.length; i++) {
if (i > 0 && nums[i] == nums[i-1] && used[i-1] == false)
continue;
used[i] = true;
path.push(nums[i]);
dfs(i+1, nums, path, used);
used[i] = false;
path.pop();
}
return ;
}
}