• 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);
        }
    };
    
  • 相关阅读:
    修改注册表启动项
    修改IP和DNS的dos命令
    屏蔽windows快捷键的方法
    本地IP,掩码,网关,DNS设置
    DevExpress的提示框
    ASP.NET如何批量保存动态生成的文本框?
    [转]SQL Server 安全性概論與無法刪除資料庫使用者的解決辦法
    如何用C#对Gridview的项目进行汇总统计?
    如何用javasript对Gridview的项目进行汇总统计?
    [转]C#如何获取客户端IP地址
  • 原文地址:https://www.cnblogs.com/shayue/p/10351087.html
Copyright © 2020-2023  润新知