思路
回溯
关键点在于,使用一个变量记录那些元素已经考虑过。那么下次应该直接从该元素之后开始考虑。
迭代(没想到)
将当前结果集中的每个元素和新元素组合,然后放入结果集中。
代码
回溯
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> rs;
vector<int> set;
addSet(rs, nums, set, 0);
return rs;
}
void addSet(vector<vector<int>> &rs, vector<int> &nums, vector<int> set, int cur) {
rs.push_back(set);
for (int i = cur; i < nums.size(); ++i) {
set.push_back(nums[i]);
addSet(rs, nums, set, i + 1);
set.pop_back();
}
}
};
迭代
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> rs{{}};
for (const auto &num : nums) {
int n = rs.size();
for (int i = 0; i < n; ++i) {
rs.push_back(rs[i]);
rs.back().push_back(num);
}
}
return rs;
}
};