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

如何查找数组中数值停止递增开始递减的拐点索引

如何在先递增后递减的数组中找到峰顶(停止递增开始递减位置)的索引

我们默认讨论的输入数组符合严格单峰特征:先严格递增,到最大值后严格递减,不存在数值相等的相邻元素、多峰值的情况,和你给出的示例匹配。

方法1:线性遍历(时间复杂度O(n),适合短数组)

  • 实现逻辑:从数组第二个元素开始遍历,第一次出现当前元素小于前一个元素时,前一个元素的位置就是转折点;如果遍历完全部元素都没有出现下降(即数组全程递增),则最后一个元素就是峰值
  • 示例代码(Python):
def find_peak(arr):
    for i in range(1, len(arr)):
        if arr[i] < arr[i-1]:
            # 返回0-based索引,需要1-based索引的话此处return i即可
            return i-1
    return len(arr) - 1
  • 测试验证:
    • 输入arr = [1,2,3,5,4,3,1],返回0-based索引3,符合要求
    • 输入arr = [4,5,6,8,6,4],返回0-based索引3,加1后得到1-based索引4,和你给出的示例结果一致

方法2:二分查找(时间复杂度O(logn),适合长数组)

  • 实现逻辑:利用数组先增后减的有序性,每次取中间位置判断当前处于递增还是递减区间,缩小搜索范围,直到锁定峰值位置
  • 示例代码(Python):
def find_peak(arr):
    left, right = 0, len(arr)-1
    while left < right:
        mid = (left + right) // 2
        # 中间元素小于右侧,说明峰值在右半段
        if arr[mid] < arr[mid+1]:
            left = mid + 1
        # 中间元素大于右侧,说明峰值在左半段或就是mid
        else:
            right = mid
    # 返回0-based索引,需要1-based索引直接left+1即可
    return left

内容的提问来源于stack exchange,提问作者Adam Sheffield

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:06:00