我有一段代码使用DFS算法来解决Leetcode中的子集问题。问题如下所示。
给定一组不同的整数S,返回所有可能的子集。
注意:子集中的元素必须是非降序。解决方案集不得包含重复的子集。
例如,如果S = [1,2,3],则解决方案是:[[3],[1],[2],[1,2,3],[1,3],[2] ,3],[1,2],[]]
我的c ++代码如下,问题是它输出“=======”,但之后它说“分段错误”。我真的没有得到这个分段错误错误。有人能告诉我代码的哪一部分是错的吗?
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
class Solution
{
public:
//Solution();
//~Solution();
std::vector< std::vector<int> > subset(std::vector<int> S){
sort(S.begin(), S.end());
std::vector< std::vector<int> > res;
std::vector<int> temp;
res.push_back(temp);
dfs(res, temp, S, 0);
return res;
}
private:
void dfs(std::vector<std::vector<int> > res, std::vector<int> temp, std::vector<int> S, int pos){
for (int i = pos; i <= S.size()-1; i++)
{
temp.push_back(S[i]);
res.push_back(temp);
dfs(res, temp, S, i+1);
temp.pop_back(); /* code */
}
}
/* data */
};
std::vector<int> array(3);
array[0]=1; array[1]=2; array[2]=3;
std::vector<std::vector<int> > res;
Solution MySolution;
res=MySolution.subset(array);
cout<<"======="<<endl;
cout<<res[0][0]<<endl;
return 0;
}
答案 0 :(得分:2)
您正在传递矢量副本,而不是矢量参考。
std::vector< std::vector<int> > res;
std::vector<int> temp;
res.push_back(temp);
dfs(res, temp, S, 0);
此代码创建一个vector<vector<int>> res;
,向其推送一个空向量,然后调用一个不会更改此范围内任何状态的函数。最后,您使用res[0][0]
取消引用。 res[0]
给出一个空向量,然后是第二个[0]
段错误。
替换此功能定义:
void dfs(std::vector<std::vector<int>> res, std::vector<int> temp, std::vector<int> S, int pos){...}
有了这个:
void dfs(std::vector<std::vector<int>>& res, std::vector<int>& temp, const std::vector<int>& S, int pos){...}
答案 1 :(得分:1)
dfs(res, temp, S, i+1);
几乎可以肯定是你问题的根源。在最后一次迭代中,i+1 == S.size()
导致分段错误。一个简单的解决方法是:
for (int i = pos; i <= S.size()-2; i++)