78 子集
题目:
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[1],
[2],
[3],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
解题思路:
大概的思路就是每个数字只有两个选择,要么选择,要么不选择。就是回溯算法(深度优先搜索)。想象一棵树。
1.先写出深度优先算法函数;
函数定义:利用引用把值传回主函数;
2.主函数调用
3.在树的最底层把遍历结果放在result里
代码:
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<int> item; //每个节点产生的新值
vector<vector<int>> result; //总结果存储
int n=nums.size();
generate(n,nums,item,result);//n代表深度
return result;
}
private:
void generate(int i,vector<int>& nums,vector<int>& item,vector<vector<int>> &result)
{
if(i==0)
{
result.push_back(item); //到树的最深处后把选择的结果放在总结果里
return; // 如果超过N层,则说明结束
}
int n=nums.size();
item.push_back(nums[n-i]); //选择nums,进一步 树的左支
generate(i-1,nums,item,result);
item.pop_back(); //退一步
generate(i-1,nums,item,result);
}
};
注意:
- 首先是结果的选择,需要放在判断if里,如果到了树的最底层,就把结果放在rusult里
- 一开始并不需要把空的item放到result里,因为最右端就是一条空的值。