zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Netty
    HttpClient 该知道一些概念
    Hibernate QBC 简单收集
    IUAP--单点登录
    js图片压缩和上传并显示
    vue移动端项目
    js自定义滚动条
    mysql5.7以上版本安装
    学习webpack
    学习es6
  • 原文地址:https://www.cnblogs.com/Tang-tangt/p/8947599.html
Copyright © 2011-2022 走看看