分割故障:无序集合插入11

发布于 2025-02-06 04:21:57 字数 2041 浏览 2 评论 0原文

我无法明白为什么以这些给定的数字值和

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 hereline 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

北方的巷 2025-02-13 04:21:57

我不清楚您的 main 功能的意图,但是当然,问题的很大一部分是 findind 如果 tar s 中不匹配任何值。否则,它将反复出现,在堆栈上添加另一个条目,最终堆栈将溢出。

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);
    }
}

您需要确定想要 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.

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);
    }
}

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文