这是生成数组的唯一子集问题的解决方案nums
:
#include <bits/stdc++.h>
using namespace std;
void solveRec(vector<int> ss, set<vector<int>> &ans, vector<int> &nums, int i)
{
if (i == nums.size())
{
sort(ss.begin(), ss.end());
ans.insert(ss);
return;
}
ss.push_back(nums[i]);
solveRec(ss, ans, nums, i + 1);
ss.pop_back();
solveRec(ss, ans, nums, i + 1);
}
该函数采用整数数组nums
作为输入以及一组向量ans
来存储唯一子集。虽然传递ss
用于按值存储当前子集的向量会产生正确的答案,但通过引用传递它却不会,为什么会这样呢?
就nums
这样吧4 4 4 1
通过引用传递(不正确)会产生:
1
1 1
1 1 4
1 4
1 4 4
1 4 4 4
按值传递(正确)会产生:
1
1 4
1 4 4
1 4 4 4
4
4 4
4 4 4
请帮忙!!!
当
ss
通过引用传递时,发生的所有突变ss
都针对单个向量实例,该实例由函数的所有执行上下文共享solveRec
。因此,sort(ss.begin(), ss.end());
没有“局部”效应。这个负面影响会在ss.pop_back();
执行时生效。该指令的目的是删除与前两行出现的调用添加的相同值。但这不再保证,因为同时已经排序,因此弹出的元素可能是不同的值。ss
ss.push_back(nums[i])
ss
对于代码的按值调用版本,
sort
调用仅对 的本地副本产生影响ss
,而对ss
调用者的 则没有影响。如果省略该
sort
调用,它也适用于传递引用版本,但显然生成的子集将不会被排序。之后你就可以这样做。