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