题目
Number: 78
Difficulty: Medium
Tags: Array, Backtracking, Bit Manipulation
Given a set of distinct integers, nums, return all possible subsets.
Note:
Elements in a subset must be in non-descending order.
The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,3]
, a solution is:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
题解
给出一个数组,求解数组的所有组合。
可以用三种方法求解,回溯,递归,和位操作。
详细说一下位操作:
比如数组大小为3,[1,2,3]
,那么所有的组合数为2^3
共8种。
如果考虑3位二进制,000,001,010,011,100,101,110,111
,每一位为1就代表相应的一种组合。因此:
000 -> []
001 -> [1]
010 -> [2]
011 -> [1, 2]
100 -> [3]
101 -> [1, 3]
110 -> [2, 3]
111 -> [1, 2, 3]
代码
Backtracking
vector<vector<int>> subsets(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<vector<int>> res;
vector<int> sub;
getsub(res, sub, nums, 0);
return res;
}
void getsub(vector<vector<int>> &res, vector<int> &sub, vector<int> &nums, int start){
res.push_back(sub);
for(int i = start; i < nums.size(); i++){
sub.push_back(nums[i]);
getsub(res, sub, nums, i + 1);
sub.pop_back();
}
}
Iterative
vector<vector<int>> subsets(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<vector<int>> res(1, vector<int>());
for(int i = 0; i < nums.size(); i++){
int n = res.size();
for(int j = 0; j < n; j++){
res.push_back(res[j]);
res.back().push_back(nums[i]);
}
}
return res;
}
Bit Manipulation
vector<vector<int>> subsets(vector<int>& nums) {
sort(nums.begin(), nums.end());
int num_sub = pow(2, nums.size());
vector<vector<int>> res(num_sub, vector<int>());
for(int i = 0; i < nums.size(); i++){
for(int j = 0; j < num_sub; j ++){
if((j >> i) & 1)
res[j].push_back(nums[i]);
}
}
return res;
}