Given a collection of integers that might contain duplicates, nums, return all possible subsets (the power set).
Note: The solution set must not contain duplicate subsets.
Example:
Input: [1,2,2] Output: [ [2], [1], [1,2,2], [2,2], [1,2], [] ]
解题思路:
一般会想到回溯递归算法,但如何解决重复数字的问题?
比如:1、2、3、3、3、4
采用以下的判断条件,首先会得到包含全部3的组合123334,下一次就会抛弃最后一个3,得到2个3的组合123334,再下一次在抛弃一个3,得到只有一个3的组合123334(黄色表示被抛弃的数字)。
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
int size_nums = nums.size();
vector<vector<int>> result{};
vector<int> path;
sort(nums.begin(), nums.end());
help(nums, path, result, 0);
return result;
}
void help(vector<int>& nums, vector<int>& path, vector<vector<int>>& result, int pos) {
result.push_back(path);
for(int i = pos; i < nums.size(); i++) {
if(i > pos && nums[i] == nums[i-1]) continue; //判断条件
path.push_back(nums[i]);
help(nums, path, result, i + 1);
path.pop_back();
}
}
};