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

LeetCode峰顶索引题报addition of unsigned offset错误排查

问题根因

代码触发运行时错误的核心原因是数组越界访问,属于未定义行为,被LeetCode环境内置的UndefinedBehaviorSanitizer检测拦截。

以报错用例[3,5,3,2,0]为例,走一遍执行流程即可复现问题:

  1. 初始边界:s=0,e=4,计算得m=2
  2. 第一次循环判断:arr[2]=3,arr[3]=2,满足arr[m] > arr[m+1]分支,执行e = m-1 = 1,更新m = 0 + (1-0)/2 = 0
  3. 第二次循环判断:代码首先访问arr[m-1]即arr[-1],该位置在数组合法内存范围之外,访问到了数组起始地址之前的内存空间,和报错信息里描述的内存地址向下溢出完全匹配。

除了左边界越界,代码还存在右边界越界风险:如果二分过程中m移动到数组最后一个索引位置,访问arr[m+1]同样会触发越界。自定义测试用例没有触发报错,只是因为选的用例没有让m落到0或者数组最后一位的边界位置,没有触发越界逻辑。

修复方案

山脉数组的定义明确说明峰值不会出现在数组首尾位置,因此可以直接把首尾排除在二分查找范围之外,从根源上避免越界:

  • 初始左边界s设为1,初始右边界e设为arr.size()-2,这样计算得到的中间值m永远落在1到arr.size()-2区间内,访问m-1和m+1都属于数组合法索引范围。

修复后的可运行代码:

int peakIndexInMountainArray(vector<int>& arr) {
    int s = 1;
    int e = arr.size() - 2;
    while(s <= e){
        int m = s + (e - s)/2;
        if(arr[m-1] < arr[m] && arr[m] > arr[m+1]){
            return m;
        }else if(arr[m] < arr[m+1]){
            s = m + 1;
        }else{
            e = m - 1;
        }
    }
    return -1;
}

内容的提问来源于stack exchange,提问作者Vasundhara Pant

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 18:24:46