Subsets II

Enumerate all distinct subsets when the input may contain duplicates — sort and skip duplicate branches.

Medium
Time O(n * 2^n) Space O(n)
LeetCode
3 min read
subsets backtracking

Problem#

Array nums may contain duplicates. Return all distinct subsets.

Examples#

  • [1,2,2][[],[1],[2],[1,2],[2,2],[1,2,2]]

Constraints#

  • 1 <= n <= 10.

Hints#

Hint 1
Sort. In DFS, skip a duplicate value if its identical predecessor wasn’t included.

Approach#

Sort. DFS over start index, each level emits the current path. When iterating choices at a level, skip nums[i] if i > start && nums[i] == nums[i-1] — that branch was already covered by the equal predecessor.

Solution#

Subsets II
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<vector<int>> out;
vector<int> path;
function<void(int)> dfs = [&](int start){
out.push_back(path);
for (int i = start; i < (int)nums.size(); ++i) {
if (i > start && nums[i] == nums[i - 1]) continue;
path.push_back(nums[i]);
dfs(i + 1);
path.pop_back();
}
};
dfs(0);
return out;
}
};

Editorial#

Sorting brings duplicates adjacent. The skip rule “i > start && nums[i] == nums[i-1]” ensures that when we have two equal values, we only take the first unused one at each level — preventing duplicate subsets like [1, 2a, 2b] and [1, 2b, 2a] from both being enumerated.

Complexity#

  • Time: O(n * 2^n).
  • Space: O(n).

Concept revision#

Search ESC

Keyboard shortcuts

Shortcuts are disabled while typing in inputs.