题解 | #集合的所有子集(一)#

集合的所有子集(一)

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();
        }
    }
};
全部评论

相关推荐

杨柳哥:这不是普通人,那这个钱的是天才
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务