90. Subsets II

Given a collection of integers that might contain duplicates, nums, return all possible subsets (the power set).

Example:

Input: [1,2,2]
Output:
[
  [2],
  [1],
  [1,2,2],
  [2,2],
  [1,2],
  []
]

求全部子集。

解决:Backtracking问题,主要问题在对重复集合的处理上,有两种解决,一种是递归的时候不判断,最后对输出答案做一个去除重复子集的操作,显然很低效。

另外一种方案,就是在递归的时候,对重复子集做处理。具体操作是:同一个位置只能放相同数字中的第一个(代码中第6行的判断语句)。

 1 class Solution {
 2 public:
 3     void FindSubset(vector<int> &nums, vector<vector<int>> &res, int pos, vector<int> &sst) {
 4         res.push_back(sst);
 5         for (int i = pos; i < nums.size(); ++i) {
 6             if (i == pos || nums[i] != nums[i-1]) {
 7                 sst.push_back(nums[i]);
 8                 FindSubset(nums, res, i + 1, sst);
 9                 sst.pop_back();
10             }
11         }
12     }
13     vector<vector<int>> subsetsWithDup(vector<int>& nums) {
14         vector<vector<int>> res;
15         vector<int> sst;
16         sort(nums.begin(), nums.end());
17         FindSubset(nums, res, 0, sst);
18         return res;
19     }
20 };

猜你喜欢

转载自www.cnblogs.com/Zzz-y/p/9061754.html
今日推荐