给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: [1,2,2] 输出: [ [2], [1], [1,2,2], [2,2], [1,2], [] ]
解题思路:
1. 组合问题==>DFS。
2. 有重复元素==>数组排序,同一层递归对相同元素只能选取一次。
class Solution { public: vector<vector<int>> subsetsWithDup(vector<int>& nums) { sort(nums.begin(), nums.end()); data = nums; int size = nums.size(); for (int i = 1; i <= size; i++) { PUSH(i); } return res; } void PUSH(int k) {//将k元素集合追加到res中 vector<int> road; DFS(road, 0, k); } void DFS(vector<int> road, int pos, int k) { if (k == 0) res.push_back(road); for (int i = pos; i <= int(data.size()) - 1; i++) { road.push_back(data[i]); DFS(road, i + 1, k - 1); road.pop_back(); while (i + 1 <= (int(data.size()) - 1) && data[i] == data[i + 1]) i++; } } private: vector<vector<int>> res = { {} }; vector<int> data; }; |