90. Subsets II

来源:互联网 发布:上海 对日程序员 招聘 编辑:程序博客网 时间:2024/06/05 18:31
  1. 问题描述
    Given a collection of integers that might contain duplicates, nums, return all possible subsets.

    Note: 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],[]]
  2. 解决办法
    递归构造,有重复的,就只在有重复的部分进行添加。即假设现在有了[],[1],[2],[1,2] 再遇到2的时候,只添加[2]+[2],[1,2]+[2]。

  3. 代码

class Solution {public:    vector<vector<int>> subsetsWithDup(vector<int>& nums) {        sort(nums.begin(),nums.end());        return helper(nums);    }    vector<vector<int>> helper(vector<int>& nums) {        vector<vector<int>> result;        if (nums.size() == 0) {            result.push_back(vector<int>());            return result;        }        int last = nums[nums.size()-1];        nums.pop_back();        int count = 0;        for (int i = nums.size() - 1; i >= 0; --i) {            if (last > nums[i])                break;            count++;        }        result = helper(nums);        int size = result.size();        if (count == 0) {            for(int i = 0; i < size; ++i) {                vector<int> tmp = result[i];                tmp.push_back(last);                result.push_back(tmp);            }        } else {            for (int i = size - 1; i >= 0; --i) {                int new_count = 0;                for(int j = result[i].size() -1; j >= 0; --j) {                    if (result[i][j] < last)                        break;                    new_count++;                }                if (new_count == count) {                    vector<int> tmp = result[i];                    tmp.push_back(last);                    result.push_back(tmp);                } else                    break;            }        }        return result;    }};
0 0