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

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. 特殊情况处理:

    • 数组长度为1时,唯一元素即为峰值,返回索引0。
    • 数组开头元素大于第二个元素时,开头是峰值,返回0。
    • 数组结尾元素大于倒数第二个元素时,结尾是峰值,返回最后一个索引。
  2. 平台峰值定位:

    • 遍历中间元素,当遇到当前元素大于前一个元素时,标记为峰值区间的起点。
    • 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:51:56