#18 Subsets II

来源:互联网 发布:光伏功率优化器原理 编辑:程序博客网 时间:2024/06/06 04:14

题目描述:

Given a list of numbers that may has duplicate numbers, return all possible subsets

 Notice
  • Each element in a subset must be in non-descending order.
  • The ordering between two subsets is free.
  • The solution set must not contain duplicate subsets.
Example

If S = [1,2,2], a solution is:

[  [2],  [1],  [1,2,2],  [2,2],  [1,2],  []]
题目思路:

求subset的过程就是对每个element进行选择的过程。在array中遍历所有的element,对于每个element有两种option:选它加入subset,或者不选它。这题因为有重复元素,所以在我的code中先用set来存答案,这样做的好处是set可以查找得到的subset是不是已经在set中存在了,以此避免重复。

Mycode(AC = 38ms):

class Solution {public:    /**     * @param S: A set of numbers.     * @return: A list of lists. All valid subsets.     */    vector<vector<int> > subsetsWithDup(const vector<int> &S) {        // write your code here        vector<int> nums(S);        vector<int> sofar;        set<vector<int>> subsets;        vector<vector<int>> ans;                // sort S        sort(nums.begin(), nums.end());        subsetsWithDup(subsets, sofar, nums, 0);                // put the vector in set into vector        for (auto it = subsets.begin(); it != subsets.end(); it++) {            ans.push_back(*it);        }                return ans;    }        void subsetsWithDup(set<vector<int>>& subsets,                        vector<int>& sofar,                        vector<int>& nums,                        int idx)    {        if (idx >= nums.size()) {            if (subsets.find(sofar) == subsets.end()) {                subsets.insert(sofar);            }            return;        }                vector<int> tmp = sofar;        // not pick nums[idx]        subsetsWithDup(subsets, tmp, nums, idx + 1);                // pick nums[idx]        tmp.push_back(nums[idx]);        subsetsWithDup(subsets, tmp, nums, idx + 1);                return;    }};


0 0
原创粉丝点击