分割故障:无序集合插入11
我无法明白为什么以这些给定的数字值和
int findind(vector<int> s,int tar, int high , int low ){
int mid = (high - low)/2;
if(s.at(mid) == tar){
return mid;
}
else if (tar < s.at(mid)){
high = mid;
return findind(s,tar,high,low);
}
else{
low = mid;
return findind(s,tar,high,low);
}
}
int main(){
vector<int> numbers = {-1,0,1,4,5,7};
int target = 8;
int id1=-1, id2=-1, N = numbers.size();
unordered_set<int> us;
vector<int> ids;
for (int i = 0; i < N; ++i)
{ if (numbers[i] == target/2 && target%2 == 0){
if (i!=N-1 && numbers[i+1] == numbers[i])
{
id1 = i;
id2 = i+1;
break;
}
else{
us.insert(numbers[i]);
}
}
else if(us.find(target - numbers[i]) == us.end()){
us.insert(numbers[i]);
}
else{
id1 = i;
id2 = findind(numbers,target - numbers[i],N,0);
break;
}
}
if(id1 < id2 ){
ids.push_back(id1+1);
ids.push_back(id2+1);
}
else{
ids.push_back(id2+1);
ids.push_back(id1+1);
}
cout<<ids[0]<<" "<<ids[1]<<" ";
return 0;
}
崇高文本中的目标错误显示分段错误是:
在此处输入代码
行1:67625分段故障:11 GTIMEOUT 4S ./twosumii-inputarrayissorted &lt; inputf.in&gt; outputf.in [以1.4秒完成出口代码139],
而LeetCode中的错误是:
AddressSanitizer:DEADLYSIGNAL
=================================================================
==30==ERROR: AddressSanitizer: stack-overflow on address 0x7ffd7e8e8fd8 (pc 0x000000334f91 bp 0x00000000001c sp 0x7ffd7e8e8fd0 T0)
==30==ABORTING
如果我将数字= {3,24,50,79,88,150,345}和Target = 200,则会发生同样的错误。
如果我评论我们。
else if(us.find(target - numbers[i]) == us.end()){
us.insert(numbers[i]);
}
但是, 那就不会给这个错误
I can't get why is it showing segmentation error with these given values of numbers and target
int findind(vector<int> s,int tar, int high , int low ){
int mid = (high - low)/2;
if(s.at(mid) == tar){
return mid;
}
else if (tar < s.at(mid)){
high = mid;
return findind(s,tar,high,low);
}
else{
low = mid;
return findind(s,tar,high,low);
}
}
int main(){
vector<int> numbers = {-1,0,1,4,5,7};
int target = 8;
int id1=-1, id2=-1, N = numbers.size();
unordered_set<int> us;
vector<int> ids;
for (int i = 0; i < N; ++i)
{ if (numbers[i] == target/2 && target%2 == 0){
if (i!=N-1 && numbers[i+1] == numbers[i])
{
id1 = i;
id2 = i+1;
break;
}
else{
us.insert(numbers[i]);
}
}
else if(us.find(target - numbers[i]) == us.end()){
us.insert(numbers[i]);
}
else{
id1 = i;
id2 = findind(numbers,target - numbers[i],N,0);
break;
}
}
if(id1 < id2 ){
ids.push_back(id1+1);
ids.push_back(id2+1);
}
else{
ids.push_back(id2+1);
ids.push_back(id1+1);
}
cout<<ids[0]<<" "<<ids[1]<<" ";
return 0;
}
error in sublime text is :
enter code here
line 1: 67625 Segmentation fault: 11 gtimeout 4s ./TwoSumII-InputArrayIsSorted < inputf.in > outputf.in
[Finished in 1.4s with exit code 139]
and error in leetcode is :
AddressSanitizer:DEADLYSIGNAL
=================================================================
==30==ERROR: AddressSanitizer: stack-overflow on address 0x7ffd7e8e8fd8 (pc 0x000000334f91 bp 0x00000000001c sp 0x7ffd7e8e8fd0 T0)
==30==ABORTING
also if I put numbers = {3,24,50,79,88,150,345} and target = 200, same error occurs.
But if I comment out us.insert(numbers[i]) in :
else if(us.find(target - numbers[i]) == us.end()){
us.insert(numbers[i]);
}
and put cout<<i<<" ";
then it don't give this error
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我不清楚您的 main 功能的意图,但是当然,问题的很大一部分是 findind 如果 tar 在 s 中不匹配任何值。否则,它将反复出现,在堆栈上添加另一个条目,最终堆栈将溢出。
您需要确定想要 findind 返回的值,如果在 tar 中没有匹配的情况下返回>高==低。
I am not clear on what you intend by your main function, but certainly a big part of the problem is that findind will run forever if tar does not match any value in s because the only way out of the function is if it finds a match, satisfying the condition (s.at(mid) == tar). Otherwise it will recurse, adding another entry on the stack and eventually the stack will overflow.
You need to decide what value you want findind to return if no match for tar is found in s and you should return that value if high == low.