• 所有子集 剑指 Offer II 079


    我只是喜欢敲代码@_@

    目录

    题目描述

    AC代码

    思路分析


    题目描述

    给定一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

    解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

    示例 1:

    输入:nums = [1,2,3]
    输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
    示例 2:

    输入:nums = [0]
    输出:[[],[0]]

    提示:

    1 <= nums.length <= 10
    -10 <= nums[i] <= 10
    nums 中的所有元素 互不相同

    AC代码

    1. class Solution {
    2. public:
    3. vectorint>> subsets(vector<int>& nums) {
    4. setint>>sons;
    5. for(auto & num:nums){
    6. setint>>temp;
    7. for(auto it:sons){
    8. it.push_back(num);
    9. temp.insert(it);
    10. }
    11. sons.insert(temp.begin(),temp.end());
    12. sons.insert({num});
    13. }
    14. vectorint>>answer;
    15. answer.push_back({});
    16. for(auto & it:sons)
    17. answer.push_back(it);
    18. return answer;
    19. }
    20. };

    思路分析

    先说一下解法哈,子集问题有很多种解决方法,我写的这个只有两层循环,回溯递归之类的也能写,这是C++写的代码,有大佬可以用四行python解决,同样的解决思路。

     

    对于一串数字,我们想要找出它的所有子集,像1,2,3这个,我们第一次取出1,它自己本身是一个子集,我们把它存起来,第二次取出2,把2插入之前找到的子集中,就有了1,2这个子集,再把它自己存进去,第三次取出3,把3插入之前找到的子集,这样就会有1,3和2,3和1,2,3这些子集,再把3自己存进去。

    基本思路是这样,实际操作的时候,会出现重复的子集,所以我们需要先用set来去重,嘻嘻嘻,你会不会有一个疑惑,为什么不一开始就用set,非要我们返回一个vector的呢,我起初也有这样的疑惑,直到我发现set不会存在{}这个空集,而vector可以装一个{}的时候就豁然开朗了。

     

    还有一个问题,我依照这样的思路写的第一次代码其实长这样:

    1. for(auto num:nums){
    2. for(auto it:sons){
    3. it.push_back(num);
    4. sons.insert(it);
    5. }
    6. sons.insert({num});
    7. }

    没有引入一个临时变量temp,直到运行超时,手动调试发现这个地方无限循环,原因在于sons每次都加一个元素,然后就不会终结循环,所以得引入一个变量。

     

  • 相关阅读:
    优雅的处理 accept= -1 出现errno = EMFILE 文件描述符达到上限 的问题
    Python循环结构程序设计
    深入理解多线程编程和 JVM 内存模型
    谷粒商城 (二十七) --------- 商品服务 API 商品管理
    【数据结构】顺序表
    使用Eclipse maven创建spring boot应用程序
    【Oracle】新建模式,用户,表空间、授权记录
    贪吃蛇QT c++设计
    buuctf----firmware
    常见面试题:js篇
  • 原文地址:https://blog.csdn.net/weixin_62264287/article/details/126359065