Description
Given a set of distinct integers, nums, return all possible subsets (the power set).
Note
The solution set must not contain duplicate subsets.
Example
If nums = [1,2,3], a solution is:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
Solution 1(C++)
class Solution {
public:
void findsubsets(vector<vector<int>> &res, vector<int> cur, vector<int> &nums, int depth){
if(depth==nums.size()){
res.push_back(cur);
return;
}
findsubsets(res, cur, nums, depth+1);
cur.push_back(nums[depth]);
findsubsets(res, cur, nums, depth+1);
}
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> res;
vector<int> cur;
int depth=0;
findsubsets(res, cur, nums, depth);
return res;
}
};
Solution 2(C++)
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
int cnt = 0;
int n = nums.size();
int sub = pow(2, n);
vector<vector<int>> result(sub, vector<int>());
for(int i = 0; i < n; i ++){
for(int j = 0; j < sub; j++){
if(j>>i & 1){
result[j].push_back(nums[i]);
}
}
}
return result;
}
};
Solution 3(C++)
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;
}
};
Solution 4(C++)
class Solution {
public:
std::vector<std::vector<int> > subsets(std::vector<int> &nums) {
std::sort(nums.begin(), nums.end());
std::vector<std::vector<int> > res;
std::vector<int> vec;
subsets(res, nums, vec, 0);
return res;
}
private:
void subsets(std::vector<std::vector<int> > &res, std::vector<int> &nums, std::vector<int> &vec, int begin) {
res.push_back(vec);
for (int i = begin; i != nums.size(); ++i) {
vec.push_back(nums[i]);
subsets(res, nums, vec, i + 1);
vec.pop_back();
}
}
};
算法分析
解法一是自己写的,使用了回溯的方法。最近同类型的题目也可以参考:LeetCode-216. Combination Sum III。就不多说了。
解法二是参考别人的答案。其实也比较简单了,我不啰嗦了。不过还是可以参考参考别人,毕竟这个代码不用烦琐的调用其他函数嘛。
解法三是迭代版本。注意学习。
程序分析
略。