一、题目
二、分析
78. 子集
本题可以采用递归回溯的算法。但是这个题与全排列不相同,因为其结果是保序的。
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
- 需要一个
begin_mark
来标记递归时开始的数组位置。
每次深度递归的时候,开始位置为当前索引+1。 - 那么递归的终止条件是什么?
当记录的数组大小等于预期的长度,那么这里预期的长度有0 ~ nums.size()
,所以可以加一层循环来固定这个长度。
for(int i = 0; i <= nums.size(); i ++){
// output length : i
BFS(nums, i, 0, nums.size());
}
三、代码
class Solution {
private:
vector<vector<int>> res;
vector<int> path;
public:
void BFS(vector<int> nums, int resultlen, int begin, int len){
if(path.size() == resultlen){
res.push_back(path);
return;
}
for(int i = begin; i < len; i ++){
path.push_back(nums[i]);
BFS(nums, resultlen, i+1, len);
path.pop_back();
}
}
vector<vector<int>> subsets(vector<int>& nums) {
for(int i = 0; i <= nums.size(); i ++){
// output length : i
BFS(nums, i, 0, nums.size());
}
return res;
}
};
执行用时:4 ms, 在所有 C++ 提交中击败了48.62%的用户
内存消耗:7.6 MB, 在所有 C++ 提交中击败了16.42%的用户