题目:《程序员面试金典(第5版)》P226
编写一个方法,返回某集合的所有子集
提示:
方法一:迭代法,每增加一个元素,就在已生成子集的基础上,给每一个子集添加该元素,形成新的子集。
vector< vector<int>> GetSubSets(vector<int> num)
{
vector< vector<int>> res;
res.push_back({});
if (num.empty())
{
return res;
}
vector<int> tmp;
tmp.push_back(num[0]);
res.push_back(tmp);
for (int i = 1; i < num.size(); i++)
{
int len = res.size();
for (int j = 0; j < len; j++)
{
tmp = res[j];
tmp.push_back(num[i]);
res.push_back(tmp);
}
}
return res;
}
方法二:递归法。
void GetSubSets_Core(const vector<int> &num, int index, vector<int> cur, vector< vector<int>> &res)
{
if (index < num.size() - 1)
{
GetSubSets_Core(num, index + 1, cur, res);
cur.push_back(num[index]);
GetSubSets_Core(num, index + 1, cur, res);
}
else
{
res.push_back(cur);
cur.push_back(num[index]);
res.push_back(cur);
}
}
vector< vector<int>> GetSubSets(const vector<int> &num)
{
vector< vector<int>> res;
vector<int> cur;
if (num.empty())
{
res.push_back(cur);
return res;
}
GetSubSets_Core(num, 0, cur, res);
return res;
}