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 };