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

判断数组是否先严格递增后严格递减,代码索引越界如何解决

问题解答

1. IndexError错误原因

你收到的错误提示索引错误:列表索引超出范围,触发原因如下:
你的循环变量i遍历的是range(len(arr)),取值范围是0 ~ len(arr)-1。当i取到最大值len(arr)-1时,代码中访问了arr[i+1],也就是arr[len(arr)],但Python列表的合法索引范围是0 ~ len(arr)-1,这个位置不存在,因此触发越界错误。
如果要比较相邻元素,循环范围需要修改为range(len(arr)-1),此时i的最大值是len(arr)-2,i+1不会超出合法索引范围。

2. for循环中的i不需要手动递增

Python的for i in range(xxx)写法会自动在每次迭代完成后给i递增加1,不需要你手动编写i += 1这类逻辑,手动递增反而会导致部分索引被跳过,逻辑出错。

3. 原有代码逻辑问题

你当前的代码逻辑完全不符合任务要求:每一轮比较相邻元素就直接输出YES/NO,会输出多个结果,也没有实现「先严格递增、后严格递减」的判断逻辑。
正确的判断逻辑如下:

  • 首先数组长度至少为3,否则不可能同时存在递增段和递减段
  • 先从左向右遍历,找到峰值点(第一个不再满足严格递增的位置)
  • 峰值点不能在数组第一个位置(没有递增段),也不能在数组最后一个位置(没有递减段)
  • 再从峰值点向右遍历,判断后续所有元素是否满足严格递减
  • 上述条件全部满足则输出YES,否则输出NO

正确代码示例

def checkType(arr, n):
    # 长度小于3直接不满足
    if n < 3:
        print("NO")
        return
    # 找峰值
    i = 0
    # 递增阶段
    while i < n-1 and arr[i] < arr[i+1]:
        i += 1
    # 峰值在开头或结尾,不满足
    if i == 0 or i == n-1:
        print("NO")
        return
    # 递减阶段
    while i < n-1 and arr[i] > arr[i+1]:
        i += 1
    # 走到末尾说明递减也满足
    print("YES" if i == n-1 else "NO")

if __name__ == "__main__" :
    arr1 = [-3, 9, 11, 20, 17, 5, 1]
    checkType(arr1, len(arr1)) # 输出YES
    arr2 = [5, 6, 7, 8, 9, 10, 1, 2, 11]
    checkType(arr2, len(arr2)) # 输出NO

内容的提问来源于stack exchange,提问作者Abhishek S V

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 09:12:03