代码:
class Solution {
private:
vector<vector<int>> result;
vector<int> path;
void traversal(vector<int>& nums,int startindex,vector<bool> used)
{
result.push_back(path);
if(startindex == nums.size())
{
return ;
}
for(int i = startindex;i < nums.size();i++)
{
if(i > 0 && nums[i] == nums[i-1] && used[i-1] == false) continue;
path.push_back(nums[i]);
used[i] = true;
traversal(nums,i+1,used);
used[i] = false;
path.pop_back();
}
}
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<bool> used(nums.size(),false);
traversal(nums,0,used);
return result;
}
};
这里也就是前面题目的知识点结合。
if(startindex == nums.size())
{
return ;
}
出口这里是startindex == nums.size()而不是startindex == nums.size()-1
因为传进来的数是即将处理的数,不是已经处理的数;
如果用第二种,会导致合法的索引nums.size()-1漏掉,
因为此时nums.size()-1传经来的状态是will,不是already。。。
所以要在处理完nums.size()-1(合法),将要处理nums.size()(不合法)的时候切断,
vector构造可以直接:vector<变量类型> 变量名(size,value)
会直接得到一个值全为value,size尺寸的vector