Leetcode AddressSanitizer 由于一个简单的条件而出错

问题描述 投票:0回答:1

我是 Leetcode 新手,我无法弄清楚我的代码有什么问题。我正在解决“二和”问题,当我尝试编写重复数字的条件时出现错误,因为您不能两次使用相同的数字。这是我的代码。如果没有第一个 if ,第二个 for 它会运行,并且对于相同的数字可以使用两次的情况显然会返回错误的答案,但是当我编写它时,leetcode 返回并在测试用例上出现 AddressSanitizer - 堆缓冲区溢出错误 [3, 3 ] 我不明白为什么。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map <int, pair<int, int>> m;
        int n=nums.size();
        for(int i=0; i<n; i++)
        {
            m[nums[i]].first++;
            m[nums[i]].second=i;
        }
        int i;
        for(i=0; i<n; i++)
        {
            if(target-nums[i]==nums[i])
            {
                if(m[nums[i]].second>1)
                {
                    break;
                }
            }
            else if(m.find(target-nums[i])!=m.end())
            {
                break;
            }
        }
        return {i, m[target-nums[i]].second};
    }
};

我在 C++ 方面非常有经验,所以我自然不知道为什么这不起作用。我尝试创建一个新变量,这样我就不会多次调用 nums[i] 并以几种不同的模式编写条件,但错误仍然存在。这没有任何意义,nums[i] 在第二个 if 中工作,但在第一个 if 中给出内存错误。

c++ arrays sum c++17
1个回答
-1
投票

您的代码已减少到发现问题所需的最少代码:

vector<int> twoSum(vector<int>& nums, int target) {
    int n=nums.size();
    int i;
    for(i=0; i<n; i++)
    {
        if(some_condition)
        {
            break;
        }
        else if(other_condition)
        {
            break;
        }
    }
    return {i, m[target-nums[i]].second};
}

在任何迭代中,当两个条件都不是

true
时,您会忽略这种情况。然后在最后一次迭代之后
i == nums.size()
nums[i]
超出范围。

© www.soinside.com 2019 - 2024. All rights reserved.