题解 | #集合的所有子集(一)#
集合的所有子集(一)
http://www.nowcoder.com/practice/c333d551eb6243e0b4d92e37a06fbfc9
递归求解
求子集时可以先规定一个quota,从1开始直到集合长度,每次只把quota数量的元素压入向量中。
代码如下:
class Solution {
public:
vector<vector<int> > subsets(vector<int> &S) {
vector<vector<int> > ret;
int n = S.size();
vector<int> tmp;
ret.push_back(tmp); // 先压入空集
sort(S.begin(), S.end());
for(int i = 1; i <= S.size(); i++){
takeSub(S,ret,tmp,0,i); // i从1到S.size,每次只取i个元素放入ret中
}
return ret;
}
void takeSub(vector<int>& S, vector<vector<int> >& ret, vector<int> tmp, int start, int quota){
if(quota==tmp.size()){ // 当tmp长度达到quota时,代表符合要求,压入ret中
ret.push_back(tmp);
return;
}
for(int i = start; i < S.size(); i++){
tmp.push_back(S[i]);
takeSub(S, ret, tmp, i+1, quota); // 递归选取元素
tmp.pop_back();
}
}
};