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
相关产品推荐
相关产品推荐

