一. 題目描述
Given a collection of integers that might contain duplicates, nums, return all possible subsets.
Note:
Elements in a subset must be in non-descending order.
The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,2]
, a solution is:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
二. 題目分析
該題相比Subsets一題略有不同,該題在給定的數組中,允許出現重復的元素。但最後輸出的排列不能有重復的組合。因此,在DFS時,使用一個數組temp來記錄某個數是否被使用過即可。
三. 示例代碼
#include
#include
using namespace std;
class Solution {
public:
vector > subsetsWithDup(vector nums) {
sort(nums.begin(), nums.end());
subsets(nums, 0);
return result;
}
private:
vector temp;
vector > result;
void subsets(vector nums, int index){
if(index == nums.size())
{
result.push_back(temp);
return;
}
if(temp.size() == 0 || temp[temp.size()-1] != nums[index])
subsets(nums, index + 1);
temp.push_back(nums[index]);
subsets(nums, index + 1);
temp.pop_back();
}
};
四. 小結
該題需要注意的地方是,避免出現同樣的排列組合。