JavaScript:寻找连续重复峰值的最后一个元素索引
数组峰值查找(含平台期处理)
问题分析
需要找到数组中的峰值索引,当峰值为连续重复的平台期时,返回该平台的最后一个元素索引;需区分不同位置的相同值(如后续相同值非峰值的情况),且不能修改原数组,优先使用非正则方法。
解决方案代码
function findPeakIndex(arr) { const len = arr.length; if (len === 1) return 0; // 处理数组开头为峰值的情况 if (arr[0] > arr[1]) return 0; // 处理数组结尾为峰值的情况 if (arr[len - 1] > arr[len - 2]) return len - 1; // 遍历中间元素,定位平台峰值 for (let i = 1; i < len - 1; i++) { // 当当前元素大于前一个,说明可能进入峰值区间 if (arr[i] > arr[i - 1]) { let j = i; // 找到当前峰值区间的最后一个元素索引 while (j < len - 1 && arr[j] === arr[j + 1]) { j++; } // 验证该区间是否为峰值(后续元素更小,或已到数组末尾) if (j === len - 1 || arr[j] > arr[j + 1]) { return j; } // 跳过已遍历的平台区间,提升效率 i = j; } } // 兜底返回(题目应保证数组至少有一个峰值) return -1; }
逻辑说明
特殊情况处理:
- 数组长度为1时,唯一元素即为峰值,返回索引0。
- 数组开头元素大于第二个元素时,开头是峰值,返回0。
- 数组结尾元素大于倒数第二个元素时,结尾是峰值,返回最后一个索引。
平台峰值定位:
- 遍历中间元素,当遇到当前元素大于前一个元素时,标记为峰值区间的起点。
- 用
while循环向后遍历,找到该峰值区间的最后一个元素索引j。 - 验证该区间是否为有效峰值:若
j是数组最后一个索引,或arr[j]大于下一个元素,则该区间是峰值,返回j。 - 将
i跳至j,避免重复遍历已处理的平台区间。
测试验证
- 测试用例
[3,6,9,9,9,9,7]:返回索引5,符合要求。 - 测试用例
[3,4,9,9,9,2,9,10,8]:返回索引4(第一个9平台的最后一个元素),后续的9因小于下一个元素10,不会被误判。 - 测试用例
[4,9,3,2,1]:返回索引1,正确识别单峰值。
内容的提问来源于stack exchange,提问作者Jeffrey Ti
相关产品推荐
相关产品推荐

