leetcode解题: Subsets II (90)

Given a collection of integers that might contain duplicates, nums, return all possible subsets.

Note: The solution set must not contain duplicate subsets.

For example,
If nums = [1,2,2], a solution is:

1
2
3
4
5
6
7
8
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]

解法1:

还是用通用的backtracking的模板,这里考察的是一个去重的feature。 对于题目意思中需要排除掉重复情况的时候, 我们首先要记得要把原数组进行排序。
然后去重时对于每一个选取的元素,考虑是否和之前的一致(或者是这次循环中第一个选取的值)
C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<vector<int>> res;
vector<int> temp;
// sort the nums
std::sort(nums.begin(), nums.end());
helper(nums, 0, temp, res);
return res;
}
void helper(vector<int>& nums, int pos, vector<int>& cur, vector<vector<int>>& res) {
res.push_back(cur);
if (pos == nums.size()) {
return;
}
for (int i = pos; i < nums.size(); ++i) {
if (i == pos || nums[i] != nums[i - 1]) {
cur.push_back(nums[i]);
helper(nums, i + 1, cur, res);
cur.pop_back();
}
}
return;
}
};

Java

1