LeetCode 852题代码超时求助:山峰数组峰值索引代码为何超时?
问题排查与修复
你的代码触发超时的核心原因是循环内未更新mid的值:
- 你仅在循环外部初始化了一次
mid,但每次循环中s或e的取值都会变化,却没有重新计算新的mid,导致程序陷入死循环,最终触发超时。
此外代码还存在潜在的数组越界风险:当mid为数组首元素(索引0)或尾元素(索引arr.size()-1)时,访问arr[mid-1]或arr[mid+1]会越界,虽然题目保证输入是合法山峰数组,但逻辑上存在漏洞。
修复后的代码
class Solution { public: int peakIndexInMountainArray(vector<int>& arr) { int s = 0; int e = arr.size() - 1; while (s < e) { int mid = s + (e - s) / 2; // 每次循环重新计算mid if (arr[mid] < arr[mid + 1]) { s = mid + 1; } else { e = mid; } } return s; // 循环结束时s==e,即为峰值索引 } };
修复说明
- 将
mid的计算移至while循环内部,确保每次循环都根据最新的s和e更新中间位置,彻底解决死循环问题。 - 简化判断逻辑:利用题目输入为合法山峰数组的前提,仅通过
arr[mid]与arr[mid+1]的比较,即可确定峰值所在区间,无需额外判断左右两侧。 - 调整循环条件为
s < e,最终s与e会收敛到峰值索引,直接返回即可,逻辑更简洁高效。
内容的提问来源于stack exchange,提问作者NoneOfYourConcern
相关产品推荐
相关产品推荐

