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

集合的所有子集(一)

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

相关推荐

我即大橘:耐泡王
点赞 评论 收藏
分享
昨天 09:08
裁应届生,一分钱补偿没有,离职了还脑控你,跟踪你,定位你,丁东服务是搞系每一个人
牛客吹哨人:建议细说...哨哥晚点统一更新到黑名单:不要重蹈覆辙!25届毁意向毁约裁员黑名单https://www.nowcoder.com/discuss/1317104
叮咚买菜稳定性 9人发布 投递叮咚买菜等公司10个岗位 >
点赞 评论 收藏
分享
2 收藏 评论
分享
牛客网
牛客企业服务