【回溯 + 去重】和 40. 组合总和 II一样是需要去重的,还是当前 i > 0 && nums[i] == nums[i - 1] && !st[i - 1]的时候说明前面的nums[i - 1]是上一层用完之后回溯回来的,这时候需要跳过。
class Solution {
List<List<Integer>> ans = new ArrayList();
LinkedList<Integer> list = new LinkedList();
Set<Integer> st = new HashSet();
int[] nums;
int n;
void dfs(int t) {
if (t == n) {
ans.add(new ArrayList(list));
return;
}
dfs(t + 1);
if (!(t >= 1 && !st.contains(t - 1) && nums[t] == nums[t - 1])) {
list.add(nums[t]);
st.add(t);
dfs(t + 1);
list.pollLast();
st.remove(t);
}
}
public List<List<Integer>> subsetsWithDup(int[] nums) {
Arrays.sort(nums);
this.nums = nums;
n = nums.length;
dfs(0);
return ans;
}
}