描述
给定一个含不同整数的集合,返回其所有的子集
子集中的元素排列必须是非降序的,解集必须不包含重复的子集
您在真实的面试中是否遇到过这个题?
是
样例
如果 S = [1,2,3]
,有如下的解:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
挑战
你可以同时用递归与非递归的方式解决么?
1.递归方式:
同样是深度优先遍历
class Solution {
public:
vector<vector<int> > result;
vector<vector<int> > subsets(vector<int> &S) {
sort(S.begin(), S.end());
vector<int> now;
fun(S, now, 0);
return result;
}
void fun(const vector<int> &s, vector<int> &now, int n)
{
if(n == s.size())
{
result.push_back(now); //递归最深处:所有元素都判定过取或不取
return;
}
else
{
fun(s, now, n+1); //不取
now.push_back(s[n]);
fun(s, now, n+1); //取
now.pop_back(); //回溯前一定要恢复回原样
}
}
};