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

LeetCode 845:数组中最长山脉问题代码调试求助

LeetCode 845 最长山脉数组代码错误排查

我在做LeetCode 845题《Longest Mountain in Array》时,写了以下代码,但无法通过所有测试用例:

class Solution:    
def longestMountain(self, arr: List[int]) -> int:
        direction = 1
        curLength = 0
        longest = 0
        
        if len(arr) < 3:
            return 0
        
        for i in range(1,len(arr)):
            cur = arr[i]
            prev = arr[i -1]
            
            if direction == 1:
                if cur > prev:
                    curLength += 1 if curLength > 0 else 2
                elif cur < prev:
                    direction = -1
                    curLength += 1
                    longest = max(longest,curLength)
                elif cur == prev:
                    curLength = 0
                    
            elif direction == -1:
                if cur > prev:
                    direction = 1
                    curLength += 1
                elif cur < prev:
                    curLength += 1
                    longest = max(longest, curLength)
                elif cur == prev:
                    direction = 1
                    curLength = 0
        return longest

遇到的问题:

  • 测试用例[9,8,7,6,5,4,3,2,1,0]应返回0,但代码输出9
  • 尝试将循环起始改为range(2, len(arr))后,又无法通过测试用例[0,1,2,3,4,5,4,3,2,1,0]

问题分析

  1. 核心逻辑缺陷:题目要求山脉必须是先严格上坡,再严格下坡的序列,纯上坡或纯下坡都不算山脉。但原代码没有判断是否经历过上坡阶段,直接把纯下坡序列误判为山脉(比如第一个测试用例,一开始就下坡,代码直接累加长度并更新longest)。
  2. 长度计算逻辑混乱:curLength的初始化和累加规则不清晰,比如第一次上坡直接设为2,后续切换方向时没有验证是否具备上坡基础,导致无效长度被计入。

修正方案

采用分阶段遍历的思路,明确区分上坡、下坡阶段,只有同时存在上坡和下坡的序列才被认定为山脉:

from typing import List

class Solution:
    def longestMountain(self, arr: List[int]) -> int:
        n = len(arr)
        if n < 3:
            return 0
        
        longest = 0
        i = 1
        
        while i < n:
            # 跳过连续平路
            while i < n and arr[i] == arr[i-1]:
                i += 1
            
            # 计算连续上坡的长度
            up_len = 0
            while i < n and arr[i] > arr[i-1]:
                up_len += 1
                i += 1
            
            # 计算连续下坡的长度
            down_len = 0
            while i < n and arr[i] < arr[i-1]:
                down_len += 1
                i += 1
            
            # 只有同时存在上坡和下坡,才构成山脉
            if up_len > 0 and down_len > 0:
                longest = max(longest, up_len + down_len + 1)
        
        return longest

代码解释

  • 先跳过所有连续平路,避免干扰阶段判断;
  • 分别计算当前位置开始的连续上坡长度和后续的连续下坡长度;
  • 只有当up_len和down_len都大于0时,才计算山脉长度(up_len + down_len + 1是因为起点元素被上坡和下坡各算一次,需要加1修正);
  • 这种方式能准确过滤纯上坡、纯下坡的无效序列,同时正确计算完整山脉的长度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 13:06:25