LeetCode | 78. Subsets

来源:互联网 发布:js跨域的实现原理 编辑:程序博客网 时间:2024/06/01 18:53

Given a set of distinct integers, nums, return all possible subsets.

Note: The solution set must not contain duplicate subsets.

For example,If nums = [1,2,3], a solution is:[  [3],  [1],  [2],  [1,2,3],  [1,3],  [2,3],  [1,2],  []]

Solution

先加入空集,然后按照子集的大小,用递归回溯,获取全部子集。基础的递归题。

Code

#include <iostream>#include <vector>using namespace std;//当前填充的是第 Index 位,候选数字从 start 开始void f(int Index, int start, int n, int k, vector<vector<int> > &res, vector<int> &temp, vector<int> &number){    if(Index == k+1)    {        res.push_back(temp);        temp.pop_back();        return;    }    for(int i=start;i<=n;i++)    {        if(n-start+1 < k-Index+1)            break;        vector<int> tt = temp;        temp.push_back(number[i-1]);        f(Index+1, i+1, n, k, res, temp, number);        temp = tt;    }}vector<vector<int>> subsets(vector<int>& nums){    int len = nums.size();    vector<vector<int> > res;    vector<int> Empty;      //空集也是子集    res.push_back(Empty);    for(int i=1;i<=len;i++)     //枚举子集的长度    {        vector<vector<int> > tmp_res;        vector<int> temp;        f(1, 1, nums.size(), i, tmp_res, temp, nums);        for(int j=0;j<tmp_res.size();j++)            res.push_back(tmp_res[j]);    }    return res;}int main(){    int t, k;    while(cin>>k)    {        vector<int> Input;        while(k--)        {            cin>>t;            Input.push_back(t);        }        vector<vector<int> > res = subsets(Input);        for(int i=0;i<res.size();i++)        {            for(int j=0;j<res[i].size();j++)            {                cout<<res[i][j]<<" ";            }            cout<<endl;        }    }    return 0;}
原创粉丝点击