zoukankan      html  css  js  c++  java
  • 78. 子集

    题目描述

    给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

    说明:解集不能包含重复的子集。

    示例:

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

    算法


     **方法1:** 对数组从前往后遍历,当遇见一个新数字,便将之前所有已经保存的子集加上这个数字后重新存入。

    方法2: 采用递归的方法,对数组从前往后遍历。当遇见一个新数字时,可以选择加入该数字或者不加入该数字以构成子集,存入保存的二维向量中。

    代码

    方法一

    #include <iostream>
    #include <vector>
    using namespace std;
    
    class Solution {
    public:
        vector<vector<int>> subsets(vector<int>& nums) {
            vector<vector<int>> backVec;
            vector<int> _ = {};
            backVec.push_back(_);
            if(nums.size() == 0)
                return backVec;
            // 从前往后遍历,新数字是nums[i]
            for(int i = 0; i < nums.size(); i++)
            {
                // 当前的二维向量一共有size个一维向量
                int size = backVec.size();
                for(int j = 0; j < size; j++)
                {
                    // 对size个一维向量增加新数字nums[i],再重新插入二维向量
                    vector<int> tmp = backVec[j];
                    tmp.push_back(nums[i]);
                    backVec.push_back(tmp);
                }
            }
    
            return backVec;
        }
    };
    
    int main()
    {
        vector<int> vec = {1,2,3};
        Solution s;
        vector<vector<int>> Vec = s.subsets(vec);
    
        for(auto i : Vec)
        {
            for(auto j : i)
                cout << j << ' ';
            cout << endl;
        }
        return 0;
    }
    

    方法二

    class Solution {
    public:
        vector<vector<int>> backVec;
        vector<int> copy_nums, temp = {};
        vector<vector<int>> subsets(vector<int>& nums) {
            backVec.push_back(temp);
            if(nums.size() == 0)
                return backVec;
    
            copy_nums.assign(nums.begin(), nums.end());
            DFS(0);
            return backVec;
        }
    
        void DFS(int n)
        {
            // 递归出口
            if(n >= copy_nums.size())
                return;
            
            // 选中当前数字
            temp.push_back(copy_nums[n]);
            backVec.push_back(temp);
            DFS(n+1);
            // 不选中当前数字
            temp.pop_back();
            DFS(n+1);
        }
    };
    
  • 相关阅读:
    代码 自动化部署
    java 反射工具
    springBoot 简化读取配置 Configuration Processor
    docker 安装redis
    怎么用mybatis
    shiro框架
    Nginx 负载均衡的几种方式
    CSS Reset
    两种CSS3圆环进度条详解
    兼容全浏览器的本地图片预览
  • 原文地址:https://www.cnblogs.com/shayue/p/10351087.html
Copyright © 2011-2022 走看看