码迷,mamicode.com
首页 > 其他好文 > 详细

【LeetCode】90.Subsets II

时间:2015-05-28 22:52:47      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:

Subsets II

Given a collection of integers that might contain duplicates, nums, return all possible subsets.

Note:

  • Elements in a subset must be in non-descending order.
  • The solution set must not contain duplicate subsets.

 

For example,
If nums = [1,2,2], a solution is:

[
  [2],
  [1],
  [1,2,2],
  [2,2],
  [1,2],
  []
]

这类有重复值的情况怎么处理
SubSets的算法
 1 class Solution {
 2 public:
 3     std::vector<std::vector<int> > subsets(std::vector<int> &nums) {
 4         std::sort(nums.begin(), nums.end());
 5         std::vector<std::vector<int> > res;
 6         std::vector<int> vec;
 7         subsets(res, nums, vec, 0);
 8         return res;
 9     }
10 private:
11     void subsets(std::vector<std::vector<int> > &res, std::vector<int> &nums, std::vector<int> &vec, int begin) {
12         res.push_back(vec);
13         for (int i = begin; i != nums.size(); ++i) {
14             vec.push_back(nums[i]);
15             subsets(res, nums, vec, i + 1);
16             vec.pop_back();
17         }
18     }
19 };
subsets([1,2,3,4]) = []
                     // push(1)
                     [1, subsets([2,3,4])] // if push N times in subsets([2,3,4]), the pop times is also N, so vec is also [1] after backtrack.
                     // pop(), push(2)
                     [2, subsets([3,4])]
                     // pop(), push(3)
                     [3, subsets([4])]
                     // pop(), push(4)
                     [4, subsets([])]
                     // pop()

 

Subsets II的解法

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

 

 

【LeetCode】90.Subsets II

标签:

原文地址:http://www.cnblogs.com/helloWaston/p/4537083.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!