子集問題

一、問題描述

集合{a,b}的子集有{},{a},,{a,b}

二、解決問題
問題分析:集合的子集問題在高中就已經(jīng)見過,一個(gè)集合的子集有2n個(gè)。關(guān)于為什么是這樣的結(jié)果呢?我們可以想象一下,一個(gè)子集中包含完整集合中的元素,每一個(gè)元素在子集中有存在和不存在兩種狀態(tài),所以子集可能的狀態(tài)個(gè)數(shù)就是2x2x...就是2n個(gè)。將子集中的元素對應(yīng)到bit,0表示元素不存在,1表示元素存在。每一個(gè)子集都對應(yīng)了一個(gè)二進(jìn)制數(shù)字,如上問題描述中,{}對應(yīng)著0b00,{a,b}對應(yīng)著0b11.

所以可以根據(jù)每個(gè)子集對應(yīng)著的數(shù)字來計(jì)算子集,C++代碼如下

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        int total = 1 << nums.size();
        vector<vector<int>> res(total);
        for(int i = 0; i < total; i++){
            for(int j = i, k = 0; j; j >>= 1, ++k){
                if(j & 0x1){
                    res[i].push_back(nums[k]);
                }
            }
        }
        return res;
    }
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容