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);
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章