本题要求给定整数数组的子集,也就是将构建的树的每个叶子结点的值收集起来加入结果数组。
具体代码如下:
class Solution {
public:
vector<int>tmp;
vector<vector<int>>result;
vector<vector<int>> subsets(vector<int>& nums) {
backtracking(nums,0);
return result;
}
void backtracking(vector<int>nums,int start)
{
result.push_back(tmp);
if(start>nums.size())
{
return;
}
for(int i=start;i<nums.size();i++)
{
tmp.push_back(nums[i]);
backtracking(nums,i+1);
tmp.pop_back();
}
}
};
三、leetcode第90题
本题给定的数组中有重复元素,要求子集不重复,也就是需要对子集进行去重操作,这需要构建一棵树并区分树枝和树层,如果在同一树层上的结点值相同则需要去重,树枝上值相同不需要去重,判断值是否相同以及相同的值是否使用过成为去重的关键条件,这里用一个bool数组来记录结点是否使用过。
具体代码如下:
class Solution {
public:
vector<vector<int>>result;
vector<int>path;
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<bool>judge(nums.size(),false);
backtracking(nums,0,judge);
return result;
}
void backtracking(vector<int>nums,int start,vector<bool>&used)
{
result.push_back(path);
for(int i=start;i<nums.size();i++)
{
if(i>0&&nums[i-1]==nums[i]&&used[i-1]==false)
{
continue;
}
path.push_back(nums[i]);
used[i]=true;
backtracking(nums,i+1,used);
used[i]=false;
path.pop_back();
}
}
};