我是 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 中给出内存错误。
您的代码已减少到发现问题所需的最少代码:
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]
超出范围。