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

LeetCode出现Address Sanitizer Heap buffer Overflow错误,请求修复

问题:LeetCode堆缓冲区溢出错误修复

我的代码在VS Code和GCC本地运行正常,但在LeetCode平台上触发Runtime error: Address sanitizer Heap buffer Overflow错误。输入数组已按升序排序,代码如下:

class Solution
{
public:
    char nextGreatestLetter(vector<char> v, char a)
    {
        int l=v.size()-1;
        if (v[l] < a)
        {
            return v[0];
        }
        int i = 0;
        while (v[i] <= a)
        {
            i++;
        }
        return v[i];
    }
};

错误原因

当数组中所有元素都小于等于目标字符a时,初始判断if (v[l] < a)仅能处理最后一个元素小于a的场景。若最后一个元素等于a,该判断不生效,程序会进入while循环,i会递增至v.size(),此时访问v[i]属于数组越界操作,直接触发堆缓冲区溢出。

修复方案

方案1:线性遍历(直观易懂)

class Solution
{
public:
    char nextGreatestLetter(vector<char>& v, char a)
    {
        int n = v.size();
        for (int i = 0; i < n; ++i) {
            if (v[i] > a) {
                return v[i];
            }
        }
        // 所有元素均<=a,返回第一个元素
        return v[0];
    }
};

方案2:二分查找(高效优化)

利用数组升序的特性,用二分查找将时间复杂度从O(n)降至O(logn):

class Solution
{
public:
    char nextGreatestLetter(vector<char>& v, char a)
    {
        int left = 0, right = v.size();
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (v[mid] > a) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        // left等于数组长度时,取模返回第一个元素;否则返回对应位置元素
        return v[left % v.size()];
    }
};

关键优化点

  • 将参数vector<char> v改为vector<char>& v,使用引用传递避免不必要的数组拷贝,提升性能。
  • 彻底修复越界问题:遍历至数组末尾未找到目标元素时,直接返回v[0],不会访问超出数组范围的索引。
  • 二分查找版本更适合处理大规模输入数据,效率更高。

内容的提问来源于stack exchange,提问作者Vaibhav Verma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:54:18