【多次过】Lintcode 18. 子集 II

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/majichen95/article/details/81631674

给定一个可能具有重复数字的列表,返回其所有可能的子集

样例

如果 S = [1,2,2],一个可能的答案为:

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

挑战

你可以同时用递归与非递归的方式解决么?

注意事项

  • 子集中的每个元素都是非降序的
  • 两个子集间的顺序是无关紧要的

解集中不能包含重复子集


解题思路:

几乎与Lintcode 17. 子集一模一样,只是在循环中增加了一个条件判断跳过重复元素。

class Solution {
public:
    /**
     * @param nums: A set of numbers.
     * @return: A list of lists. All valid subsets.
     */
    vector<vector<int>> subsetsWithDup(vector<int> &nums) 
    {
        // write your code here
        vector<vector<int>> res;
        vector<int> temp;
        sort(nums.begin() , nums.end());
        
        dfs(nums, 0, temp, res);
        
        return res;
    }
    
    void dfs(vector<int> &nums, int start, vector<int> &temp, vector<vector<int>> &res)
     {
         res.push_back(temp);
         
         for(int i=start ; i<nums.size() ; i++)
         {
             if(i > start && nums[i]==nums[i-1]) // skip duplicates
                continue;
                
             temp.push_back(nums[i]);
             dfs(nums, i+1 , temp, res);
             temp.pop_back();
         }
     }
};

猜你喜欢

转载自blog.csdn.net/majichen95/article/details/81631674