使用双指针法实现两数之和时出现堆缓冲区溢出问题求助
堆缓冲区溢出原因与双指针法修复方案
错误原因
- 语法错误导致逻辑混乱:你的
for循环未添加花括号,仅int j = 0;属于循环体,后续while循环完全在for循环外执行。同时for循环内的int i未初始化,会持有随机值,直接访问numbers[i]本身就存在风险。 - 未限制索引范围导致越界:
while循环仅判断numbers[i] + numbers[j] <= target,未限制j的最大值。当j递增至等于numbers.size()时,访问numbers[j]会超出vector的内存区域,触发heap-buffer-overflow。比如测试用例[5,25,75]中,j会被加到3(数组最大索引为2),此时访问越界。 - 偏离双指针逻辑:你原本计划用双指针法,但当前写法实际是错误的嵌套遍历,还存在变量重复定义(外部和
for循环内都定义了int i)的问题。
修复方案
题目要求常量额外空间,且数组为非递减排序,标准双指针法是最优解:
- 左指针从数组起始位置(索引0)出发,右指针从数组末尾(索引
numbers.size()-1)出发。 - 根据两元素和与
target的大小关系移动指针:- 和等于
target:直接返回1索引的结果。 - 和小于
target:左指针右移,增大当前和。 - 和大于
target:右指针左移,减小当前和。
- 和等于
修复后的代码
class Solution { public: vector<int> twoSum(vector<int>& numbers, int target) { int left = 0; int right = numbers.size() - 1; while (left < right) { int sum = numbers[left] + numbers[right]; if (sum == target) { return {left + 1, right + 1}; } else if (sum < target) { left++; } else { right--; } } // 题目保证有唯一解,此处不会执行 return {}; } };
代码说明
- 时间复杂度O(n),空间复杂度O(1),完全符合题目要求。
- 所有数组访问的索引均在合法范围内,不会出现越界问题。
- 利用数组非递减特性,每次移动指针都能缩小搜索范围,确保高效找到唯一解。
- 天然满足
index1 < index2的要求,无需额外调整顺序。
内容的提问来源于stack exchange,提问作者Battleship
相关产品推荐
相关产品推荐

