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]
问题分析
- 核心逻辑缺陷:题目要求山脉必须是先严格上坡,再严格下坡的序列,纯上坡或纯下坡都不算山脉。但原代码没有判断是否经历过上坡阶段,直接把纯下坡序列误判为山脉(比如第一个测试用例,一开始就下坡,代码直接累加长度并更新longest)。
- 长度计算逻辑混乱:
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
相关产品推荐
相关产品推荐

