You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用双指针法实现两数之和时出现堆缓冲区溢出问题求助

堆缓冲区溢出原因与双指针法修复方案

错误原因

  1. 语法错误导致逻辑混乱:你的for循环未添加花括号,仅int j = 0;属于循环体,后续while循环完全在for循环外执行。同时for循环内的int i未初始化,会持有随机值,直接访问numbers[i]本身就存在风险。
  2. 未限制索引范围导致越界:while循环仅判断numbers[i] + numbers[j] <= target,未限制j的最大值。当j递增至等于numbers.size()时,访问numbers[j]会超出vector的内存区域,触发heap-buffer-overflow。比如测试用例[5,25,75]中,j会被加到3(数组最大索引为2),此时访问越界。
  3. 偏离双指针逻辑:你原本计划用双指针法,但当前写法实际是错误的嵌套遍历,还存在变量重复定义(外部和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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:51:17