题目描述:
给出一个整数数组nums
,长度为 $ n $ ,数组中的可能包含重复元素。返回该数组所有可能的子集。
解集中不能包含重复的子集。可以按照任意顺序返回解集。
数据范围:
$ 1\le n \le 10 $
题解:
类似47.全排列II这个问题。只需要排序,然后对于重复的数字,依次从左往右取数。与全排列不同的是,如果当前的数不能取直接跳到下一个数。
使用二进制枚举时,如果一个二进制数,存在不按顺序取数行为,直接跳过该二进制数。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| class Solution { public: const static int maxn = 1e5 + 10; const static int maxm = 1e5 + 10; const static int INF = 0x3f3f3f3f; vector<vector<int>> ans; void dfs(int step, vector<int> &nums, vector<int> &cur, vector<bool> &vis) { if (step == nums.size()) { ans.emplace_back(cur); return; } if (step > 0 && nums[step] == nums[step - 1] && !vis[step - 1]) { dfs(step + 1, nums, cur, vis); } else { cur.emplace_back(nums[step]); vis[step] = true; dfs(step + 1, nums, cur, vis); vis[step] = false; cur.pop_back(); dfs(step + 1, nums, cur, vis); } } vector<vector<int>> subsetsWithDup(vector<int> &nums) { vector<bool> vis(nums.size(), false); vector<int> cur; sort(nums.begin(), nums.end()); dfs(0, nums, cur, vis); return ans; } };
|