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

集合的所有子集(一)

http://www.nowcoder.com/practice/c333d551eb6243e0b4d92e37a06fbfc9

1. 递归

每次递归,当前位置的数字可以选择或者不选择。

class Solution {
public:
    vector<vector<int> > res;
    void dfs(vector<int>& S, vector<int> tmp, int start){
        res.push_back(tmp);
        if(start == S.size()){
            return;
        }
        for(size_t i = start; i < S.size(); i++){
            tmp.push_back(S[i]);
            dfs(S, tmp, i + 1);
            tmp.pop_back();
        }
    }
    
    vector<vector<int> > subsets(vector<int> &S) {
        if(S.empty()) return res;
        sort(S.begin(), S.end());
        dfs(S, vector<int>(), 0);
        return res;
    }
};

2. 位运算:n个元素的子集共有2^n个.

将0~2^n-1的每一个数转换为n位的二进制数来看,如果第0~n-1的某一位为1,则选择对应位置的数。遍历完即可获得所有子集。

class Solution {
public:
    vector<vector<int> > subsets(vector<int> &S) {
        vector<vector<int> > res;
        vector<int> tmp;
        int n = S.size();
        if(S.empty()) return res;
        sort(S.begin(), S.end());
        for(int i = 0; i < pow(2, n); i++){
            for(int j = 0; j < n; j++){
                if((i >> j) & 1){
                    tmp.push_back(S[j]);
                }
            }
            res.push_back(tmp);
            tmp.clear();
        }
        return res;
    }
};
全部评论

相关推荐

04-21 13:50
已编辑
北京理工大学 硬件测试
我们学校连夜发了声明,绝了绝了!看完了全部ppt,震碎三观。一般情况下我是站学生的,但这不是一般情况。这男的不能被取消学位吗?自己吃到了红利,靠着面试泄题得到的保研,又反手举报导师。这导师是《被举报系列》里最惨最恋爱脑的了,当然最可怜的是他的同妻……
牛客小黄鱼:看了ppt的聊天记录,真不知道谁才是受害者!有人为你剥过柚子吗?有人为你雪地里等你吗?有人为你写过情书吗?有人为你规划未来吗?有人为你小心翼翼吗?有人为你整页失眠失眠吗? 有人为你送上自己的科研成果吗?有人为你安排出国留学吗?有人愿意给你一个月2万吗?
点赞 评论 收藏
分享
03-29 12:10
门头沟学院 C++
挣K存W养DOG:散漫消极者淘汰,一眼坑爹。实习几个月转正的时候说你加班太少,能力还行态度不够积极裁了,马上老实。
点赞 评论 收藏
分享
ResourceUtilization:我嘞个董事长
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务