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

    78. 子集

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

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

    示例:

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

     

    方法一:迭代法实现子集枚举

    复杂度分析

    时间复杂度:O(n×2 n)。一共 2n个状态,每种状态需要 O(n) 的时间来构造子集。

    空间复杂度:O(n)。即构造子集使用的临时数组 t 的空间代价。

    代码:
    #include <iostream>
    #include<bits/stdc++.h>
    #include<bitset>
    #include<vector>
    using namespace std;
    class Solution {
    public:
        vector<int> t;
        vector<vector<int> > ans;
        vector<vector<int> > subsets(vector<int>& nums) {
            int n = nums.size();
            for (int mask = 0; mask < (1 << n); ++mask) {
                t.clear();
                for (int i = 0; i < n; ++i) {
                    if (mask & (1 << i)) {
                        t.push_back(nums[i]);
                    }
                }
                ans.push_back(t);
            }
            return ans;
        }
    };
    
    
    int main()
    {
        Solution sol;
        vector<int>nums;
        nums.push_back(1);
        nums.push_back(2);
        nums.push_back(3);
        vector<vector<int> > ans =sol.subsets(nums);
        for (int  i = 0; i < ans.size(); i++)
        {
            for (int  j = 0; j < ans[i].size(); j++)
            {
                cout<<ans[i][j]<<" ";
            }
            cout<<endl;
        }
        return 0;
    }

    方法二:递归法实现子集枚举

    思路与算法

    我们也可以用递归来实现子集枚举。

    假设我们需要找到一个长度为 nn 的序列 aa 的所有子序列,代码框架是这样的:

    vector<int> t;
    void dfs(int cur, int n) {
        if (cur == n) {
            // 记录答案
            // ...
            return;
        }
        // 考虑选择当前位置
        t.push_back(cur);
        dfs(cur + 1, n, k);
        t.pop_back();
        // 考虑不选择当前位置
        dfs(cur + 1, n, k);
    }

     代码:

    class Solution {
    public:
        vector<int> t;
        vector<vector<int>> ans;
    
        void dfs(int cur, vector<int>& nums) {
            if (cur == nums.size()) {
                ans.push_back(t);
                return;
            }
            t.push_back(nums[cur]);
            dfs(cur + 1, nums);
            t.pop_back();
            dfs(cur + 1, nums);
        }
    
        vector<vector<int>> subsets(vector<int>& nums) {
            dfs(0, nums);
            return ans;
        }
    };

     

    因上求缘,果上努力~~~~ 作者:每天卷学习,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/13702261.html

  • 相关阅读:
    UVALIVE 6958 Indoorienteering
    Calendar Game
    Wizard's Tour
    2017 ACM-ICPC 亚洲区(西安赛区)网络赛 G. Xor
    Alliances
    2017沈阳网络赛hdu6199 gems gems gems
    pytorch 的max函数
    pytorch调用gpu
    jupyter notebook实现代码自动补全
    pytorch强大的自动求导功能
  • 原文地址:https://www.cnblogs.com/BlairGrowing/p/13702261.html
Copyright © 2011-2022 走看看