题目大意
解题思路
Code
class Solution {public:vector<vector<int>> ans;void dfs(vector<int>& a, int idx, vector<int>& res) {if (idx >= a.size()) {ans.push_back(res);return ;}dfs(a, idx+1, res);res.push_back(a[idx]);dfs(a, idx+1, res);res.pop_back();//ans.push_back(res);}vector<vector<int>> subsets(vector<int>& nums) {vector<int> res(0);dfs(nums, 0, res);return ans;}};
90
这次数组中有重复元素了,也就导致其子集中会有重复子集。
- 法0,hash查重,太占空间了
- 法1,观察规律,发现重复子集是因为,相同元素,上一次没选,而选了这个。排序后使得相同元素相邻!
class Solution { public: vector<vector<int>> subsetsWithDup(vector<int>& nums) { vector<int> res; vector<vector<int>> ans; unordered_map<vector<int>, int> vis; int n = nums.size(); for (int mask=0;mask<(1<<n);++mask) { res.clear(); for (int i=0;i<n;++i) { if (mask&1) { res.push_back(nums[i]); } } if (!vis[res]) { ans.push_back(res); vis[res] = 1; } } return ans; } };
