问题
https://leetcode.com/problems/subsets-ii/
解法
回溯法, 首先不考虑重复的出现的情况, 那么就是列举C(n, 0), C(n, 1), C(n, 2) … C(n, n);
C(n, k) 可以使用递归求解, 每一层决定一个数字,最多递归k层。每层枚举使用的数字。
接着考虑有重复的情况, 首先将输入数字排序, 使得相同数字在一起, 然后在枚举时,我们制定一个规则:当相同的两个数字,前一个没有被选,则后一个也不选。这样一串相同数字,每次都优先选前面的数字, 就消除了重复的情况。
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<vector<int>> ret;
n = nums.size();
sort(nums.begin(), nums.end());
for (k =0; k<=n; ++k)
{
vector<int> now(k, 0);
backtrack(ret, now, 0, 0, nums);
}
return ret;
}
void backtrack(vector<vector<int>> &ret, vector<int> &now, int depth, int start, vector<int> &nums)
{
if (k==depth)
{
ret.push_back(now);
return;
}
for (int i=start; i<=n-k+depth; ++i)
{
if (i!= start && nums[i] == nums[i-1])
continue;
now[depth] = nums[i];
backtrack(ret, now, depth+1, i+1, nums);
}
}
private:
int k, n;
};