78. Subsets**
https://leetcode.com/problems/subsets/
题目描述
Given a set of distinct integers, nums
, return all possible subsets (the power set).
Note: The solution set must not contain duplicate subsets.
Example:
Input: nums = [1,2,3]
Output:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
C++ 实现 1
DFS + Backtracing. (Recursive 方法)
class Solution {
private:
void dfs(const vector<int> &nums, int start, vector<int> &cur, vector<vector<int>> &res) {
res.push_back(cur);
for (int i = start; i < nums.size(); ++ i) {
cur.push_back(nums[i]);
dfs(nums, i + 1, cur, res); // 注意这里是 i + 1, 容易写成 start + 1...
cur.pop_back();
}
}
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> res;
vector<int> cur;
dfs(nums, 0, cur, res);
return res;
}
};
C++ 实现 2
Iterative 方法. 参阅: C++ Recursive/Iterative/Bit-Manipulation
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> res{{}};
for (int i = 0; i < nums.size(); ++ i) {
int n = res.size();
for (int j = 0; j < n; ++ j) {
res.push_back(res[j]); // 注意这里是 j
res.back().push_back(nums[i]);
}
}
return res;
}
};
C++ 实现 3
参阅:
DFS + Backtracing. 此处考虑二叉树的形式, 因为没有元素在集合中只有 “出现” 和 “不出现” 两种状态.
class Solution {
private:
vector<vector<int> >res;
public:
vector<vector<int> > subsets(vector<int> &S) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
//先排序,然后dfs每个元素选或者不选,最后叶子节点就是所有解
res.clear();
sort(S.begin(), S.end());
vector<int>tmpres;
dfs(S, 0, tmpres);
return res;
}
// 注意和 `C++ 实现 1` 相比, for 循环没有了
void dfs(vector<int> &S, int iend, vector<int> &tmpres)
{
if(iend == S.size())
{res.push_back(tmpres); return;}
//选择S[iend]
tmpres.push_back(S[iend]);
dfs(S, iend+1, tmpres);
tmpres.pop_back();
//不选择S[iend]
dfs(S, iend+1, tmpres);
}
};