分段错误11:在这种排序和搜索问题中

Posted

技术标签:

【中文标题】分段错误11:在这种排序和搜索问题中【英文标题】:segmentation fault11: in this sort and search question 【发布时间】:2020-04-04 07:27:07 【问题描述】:

问题: 给定一个整数数组,返回两个数字的索引,使它们相加为特定目标。

解决方案-

将总和复制到 cpy 对 cpy 进行排序以便稍后进行二分搜索 迭代 cpy 搜索目标 - current_no。 如果存在于 cpy 中 获取原始向量 nums 中的索引 将索引附加到结果向量并返回结果向量
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

class Solution 
public:
    vector<int> twoSum(vector<int>& nums, int target) 
        
        vector<int>cpy;
        vector<int>result(2);
        result[0] = 0;
        result[1] = 0;
        
        int indx = 0;
        for(indx = 0; indx < nums.size(); ++indx)
        
            cpy[indx] = nums[indx];
        
        
        // sorting to enable binary search on vector later on
        sort(cpy.begin(), cpy.end());
        
        
        int x, y;
        bool ispresent;
        vector<int>:: iterator base1;
        vector<int>:: iterator it2;
        base1 = nums.begin();
        
        for(indx = 0; indx < cpy.size(); ++indx)
        
            x = cpy[indx];
            y = target - x;
            
            // sing bin search to make search time faster
            ispresent = binary_search(cpy.begin() + indx, cpy.end(), y);
            
            if(ispresent)
            
                cout << "found" << endl;
                // fiding index of x, y in original vector nums
                result[0] = find(nums.begin(), nums.end(), x) - base1;
                result[1] = find(find(nums.begin(), nums.end(), x) + 1, nums.end(), y) - base1;
                break;
            
        
        return result;
    
    
;

int main()

    int n;
    cin >> n;

    vector<int> v(n);
    for(int i = 0; i < n; ++i)
    
        cin >> v[i];
    

    int target;
    cin >> target;

    Solution ob;

    vector<int>res = ob.twoSum(v, target);
    cout << res[0] << " " << res[1] << endl;

    return 0;

【问题讨论】:

仅供参考,只需通过一次即可通过列表。你也不需要排序。想想unordered_set 【参考方案1】:

很简单,您正在向 cpy 向量写入值,但它的大小为零。

有一个非常简单的方法来复制向量,只需使用=

vector<int> cpy = nums;

这就是你所需要的。你不需要你写的 for 循环。

【讨论】:

旁注:调试器几乎可以立即找到原因。在调试器中运行程序。等待崩溃。查看回溯以获取线索。如果您不知道需要先适当地调整vector 的大小,您仍然会遇到困难,但至少您离得更近了。 是的,我使用过 gdb,但不知道向量首先需要大小。

以上是关于分段错误11:在这种排序和搜索问题中的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV minMaxLoc 函数中的分段错误

在向量中搜索时出现分段错误

分段错误:在 Mac 上为 11,但在 Linux 上没有,同时在 C 中创建数组

如何解决此分段错误:以下代码的 11 错误?

分段错误:11

分段错误:在 C++ 中弹出向量时出现 11