给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
思路
要列出数组的所有子集,因为数组是不含重复元素的,所以对于每一个位置的数字,有两个选择,选或者不选。
可以画出以下的递归树:
- 根为空集,左子树为选择nums[i],右子树为不选择nums[i],
- 且对于树中的任何一个位置都可作为一个子集
如:
[1],选择1
[1,2],选择1下,选择2
[1,2,3],选择1下,选择2下,选择3
[1,3],由3回溯到2,即不选择2的情况,选择3
[2,3],。。。
[1,2],。。。。。。
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
result.push_back(item);
digui(0,nums,item,result);
return result;
}
void digui(int n,vector<int>& nums,vector<int>& item,vector<vector<int>>& result){
if(n>=nums.size()){
return;
}
item.push_back(nums[n]);
result.push_back(item);
digui(n+1,nums,item,result);
item.pop_back();
digui(n+1,nums,item,result);
}
private:
vector<int> item;
vector<vector<int>> result;
};