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

原文地址:https://www.cnblogs.com/BlairGrowing/p/13702261.html