一、問題描述
集合{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;
}
};