78 子集
解法一.位运算
2位数有4种子集 null,1,2,12
3位数有8种子集
而 1<<2==4 1<<3==8
0到7的二进制表示依次为
0000
0001
0010
0011
0100
0101
0110
0111
将数组整体看成一个数,将数组中的每一位看成一个1,即可得到全排列
0000 null
0001 1
0010 2
0011 1 2
0100 3
0101 1 3
0110 2 3
0111 1 2 3
代码如下
class Solution {
public:
vector<vector<int>> subsets(vector<int> &nums) {
vector<vector<int>> res;
int n = nums.size();
cout << (1 << n) << endl;
for (int i = 0; i < (1 << n); i++) {
vector<int> temp;
for (int j = 0; j < n; j++) {
cout << (i >> j) << " " << ((i >> j) & 1) << endl;
if (i >> j & 1)
temp.push_back(nums[j]);
}
res.push_back(temp);
}
return res;
}
};
解法二.回溯
class Solution {
public:
vector<vector<int>> save;
void set(int i, const vector<int> &num, int val, vector<int> vec) {
vec.push_back(val);
save.push_back(vec);
if (i == num.size())
return;
for (int x = i; x < num.size(); ++x)
set(x + 1, num, num[x], vec);
}
vector<vector<int>> subsets(vector<int> &nums) {
if (nums.empty())
return save;
for (int x = 0; x < nums.size(); ++x)
set(x + 1, nums, nums[x], {});
save.push_back({});
return save;
}
};