18 带重复元素的子集

原题网址:https://www.lintcode.com/zh-cn/problem/subsets-ii/

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

 注意事项
  • 子集中的每个元素都是非降序的
  • 两个子集间的顺序是无关紧要的
  • 解集中不能包含重复子集
样例

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

[
  [2],
  [1],
  [1,2,2],
  [2,2],
  [1,2],
  []
]
挑战 

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

标签 

 

方法1. 参考15、16题,可以非常鸡贼的设置一个判断数组是否已存在于二维数组result中的函数,然后还是子集的代码,只不过插入数组到result中前判断一下result中是否已存在该数组,嗯……

AC代码:

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>> result;
    if (nums.empty())
    {
        result.push_back(nums);
        return result;
    }
    sort(nums.begin(),nums.end());
    vector<int> first;
    first.push_back(nums[0]);
    result.push_back(first);

    for (int i=1;i<(int)nums.size();i++)
    {
        int size1=result.size();
        for (int j=0;j<size1;j++)
        {
            vector<int> temp1= result[j];
            temp1.push_back(nums[i]);
            if (!isExist(result,temp1))
            {
                result.push_back(temp1);
            }
        }
        vector<int> temp2;
        temp2.push_back(nums[i]);
        if (!isExist(result,temp2))
        {
            result.push_back(temp2);
        }
        
    }
    vector<int> nul;
    result.push_back(nul);
    return result;
    }
    
    bool isSameNum(vector<int> num1,vector<int> num2)
{
    if (num1.size()!=num2.size())
    {
        return false;
    }
    for (int i=0;i<(int)num1.size();i++)
    {
        if (num1[i]!=num2[i])
        {
            return false;
        }
    }
    return true;
}

bool isExist(vector<vector<int>> result,vector<int> num)
{
    if (result.empty())
    {
        return false;
    }
    for (int i=0;i<(int)result.size();i++)
    {
        if (isSameNum(num,result[i]))
        {
            return true;
        }            
    }
    return false;
}

};

其他方法:https://www.cnblogs.com/felixfang/p/3775712.html  可以多啃几遍

 

非递归:https://blog.csdn.net/lhanchao/article/details/54629065

递归:https://www.jianshu.com/p/557788c1dcc1

posted @ 2018-04-25 22:04  eeeeeeee鹅  阅读(180)  评论(0编辑  收藏  举报