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], [] ]
解答:
1.我的解法,回溯(注意:要先对nums排序,否则后面会乱)
class Solution {
public:
void subset(vector<vector<int>>& res, vector<int> nums, vector<int>& vec, int begin){
res.push_back(vec);
for(int i = begin; i < nums.size(); i++){
vec.push_back(nums[i]);
subset(res,nums,vec,i+1);
vec.pop_back();
}
}
vector<vector<int>> subsets(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<vector<int>> res;
vector<int> vec;
int begin = 0;
subset(res, nums,vec,begin);
return res;
}
};
2.别人的方法。迭代
(这是别人的代码,尊重作者的劳动成果!)
假设对[1,2,3]
- Initially:
[[]]
- Adding the first number to all the existed subsets:
[[], [1]]
; - Adding the second number to all the existed subsets:
[[], [1], [2], [1, 2]]
; - Adding the third number to all the existed subsets:
[[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]
.
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<vector<int>> subs(1, vector<int>());
for (int i = 0; i < nums.size(); i++) {
int n = subs.size();
for (int j = 0; j < n; j++) {
subs.push_back(subs[j]);
subs.back().push_back(nums[i]);
}
}
return subs;
}
};
3.位处理(这是别人的代码,尊重作者的劳动成果!)
There is also another a way to visualize this idea. That is, if we use the above example, 1
appears once in every two consecutive subsets, 2
appears twice in every four consecutive subsets, and 3
appears four times in every eight subsets, shown in the following (initially the 8
subsets are all empty):
[], [], [], [], [], [], [], []
[], [1], [], [1], [], [1], [], [1]
[], [1], [2], [1, 2], [], [1], [2], [1, 2]
[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
sort(nums.begin(), nums.end());
int num_subset = pow(2, nums.size());
vector<vector<int> > res(num_subset, vector<int>());
for (int i = 0; i < nums.size(); i++)
for (int j = 0; j < num_subset; j++)
if ((j >> i) & 1)
res[j].push_back(nums[i]);
return res;
}
};