繁体   English   中英

是什么导致堆栈缓冲区溢出?

[英]What is causing the Stack Buffer Overflow?

我在 LeetCode 上解决了这个问题 - https://leetcode.com/problems/k-closest-points-to-origin/我可以做两件事 - 1)我们需要按升序对给定点的距离进行排序。
2)我们还必须有与原点距离相关的点。

经过头脑风暴,我想出了使用 c++ stl 中的地图的想法。 因为他们会负责排序以及距离和点的关联。 我的代码如下 -

class Solution 
{
public:
    vector<vector<int>> kClosest(vector<vector<int>>& points, int k) 
    {
        map<double,vector<int>> m;
        vector<vector<int>> answer;
        for (int i = 0; i < points.size(); i++)
        {
            double x = sqrt((points[i][0] * points[i][0]) + (points[i][1] * points[i][1]));
            m.insert(pair<double, vector<int>>(x,{points[i][0], points[i][1]}));
        }
        
        for (int i = 0; i < k; i++)
        {
            auto it = m.begin();
            advance(it,i);
            answer.push_back(it->second);
        }
        
        return answer;
    }
};

对于前 2 个测试用例,它工作正常并引发运行时错误 - 堆栈缓冲区溢出,我最初使用 float 表示 x 但我认为由于限制它会导致错误,所以我将类型更改为 double 但仍然没有运气!

如果有人能帮我找出这里的错误,那将是一个很大的帮助。 先感谢您!

假设有两个点 [-1, 0] 和 [0, 1],k 的值为 2。如果您使用 map,您将仅获得 1 个 <key, value> 对,因为密钥(在本例中为 sqrt(1))对于两个点都是相同的。 因此,您需要使用multimap ,您可以在其中多次使用相同的键。 在这里阅读。

基于您的代码的工作代码示例:

class Solution 
{
public:
    vector<vector<int>> kClosest(vector<vector<int>>& points, int k) 
    {
        multimap<int,vector<int>> m;
        vector<vector<int>> answer;
        for (int i = 0; i < points.size(); i++)
        {
            int x = (points[i][0] * points[i][0]) + (points[i][1] * points[i][1]);
            m.insert(pair<int, vector<int>>(x,{points[i][0], points[i][1]}));
        }
        int i = 0;
        for (auto it = m.begin(); it != m.end() && i < k; it++, i++) {
            //cout << it->first << " : " << it->second[0] << ", " << it->second[1] << endl;
            answer.push_back(it->second);
        }
        
        return answer;
    }
};

建议:

  • 您无需担心是将距离值存储为 double 还是 float。 由于您将 sqrt(some_value1) 与 sqrt(some_value2) 进行比较,因此您可以完全省略 sqrt。
  • std::advance 具有线性时间复杂度。 您可以在 for 循环的开头简单地初始化迭代器,并使用 ++ 运算符递增。 该运算符具有恒定的时间复杂度。 在此处阅读有关 std::advance 的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM