题目链接:90. 子集 II - 力扣(LeetCode)
代码:
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