难度:【medium】
for ex. 输出的子数组的顺序没有限制。
Input: nums = [1,2,3]
Output:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
主要由两种方法:
方法1:深度优先搜索
vector> subsets(vector& nums) {
vector > subs;
vector sub;
GetSubs(0, nums, sub, subs);
return subs;
}
void GetSubs(int i, vector &nums, vector &sub, vector > &subs) {
subs.push_back(sub);
for (int j = i; j < nums.size(); ++j) {
sub.push_back(nums[j]);
GetSubs(j + 1, nums, sub, subs);
sub.pop_back();
}
}
方法2:利用bit位
例如:数组 [1, 2, 3],每个元素可以看成001,010,100. 先计算子集合的数量 2^3=8.
从0到7每个值 与 每个元素nums[i]求与运算,如果是true,就插入元素nums[i]。
vector> subsets(vector& nums) {
vector > res;
vector tmp;
int j = 0;
int cnt = 1 << nums.size(); // 子集合数量
while (j < cnt) {
tmp.clear();
for (int i = 0; i < nums.size(); ++i) {
if ((1 << i) & j) {
tmp.push_back(nums[i]);
}
}
res.push_back(tmp);
++j;
}
return res;
}