解题思路:
经典的深度优先搜索问题。
这里,根据子集的元素个数 i ,分别进行 dfs 。因为 nums 数组中有重复元素,所以在 dfs 程序中,需要有一个去重的判断。
判断逻辑为:当前元素与上一个元素相等,那就跳过当前元素的深搜。但是还有一个很重要的条件是 i > begin,因为这样,才能保证一定会对深搜的某一层递归中的第一个元素进行搜索。这样得到的答案才不会缺少子集。
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
//先对nums进行排序
sort(nums.begin(), nums.end());
vector<vector<int> > res;
vector<int> cur;
for(int i = 0; i <= nums.size(); i++){
dfs(res, cur, nums, 0, i);
}
return res;
}
void dfs(vector<vector<int> >& res, vector<int>& cur, vector<int>& nums, int begin, int n){
if(cur.size() == n){
res.push