本文共 2366 字,大约阅读时间需要 7 分钟。
为了解决数组中的最长山脉问题,我们需要找到数组中的山峰和山谷,然后计算每个山峰到最近的两个山谷的距离,找出最大的那个作为最长的山脉长度。以下是详细的优化步骤:
class Solution: def longestMountain(self, A: List[int]) -> int: if len(A) < 3: return 0 peaks = [] valleys = [] for i in range(len(A)): # 检查是否为山峰 if A[i] > A[i-1] and A[i] > A[i+1]: peaks.append(i) # 检查是否为山谷 elif A[i] < A[i-1] and A[i] < A[i+1]: valleys.append(i) if not peaks: return 0 max_length = 0 # 预处理:为每个位置记录最近的山谷位置 prev_valley = [-1] * len(A) next_valley = [len(A)] * len(A) # 找到每个位置的左边最近的山谷 for i in range(len(A)): if A[i] < A[i-1] and A[i] < A[i+1]: prev_valley[i] = i # 这个位置是山谷 for j in range(i-1, -1, -1): if A[j] > A[j+1] and A[j] > A[j+2]: prev_valley[j+1] = j break # 找到每个位置的右边最近的山谷 for i in range(len(A)-1, -1, -1): if A[i] < A[i+1] and A[i] < A[i-1]: next_valley[i] = i for j in range(i+1, len(A)): if A[j] < A[j-1] and A[j] < A[j-2]: next_valley[j-2] = j break # 计算每个山峰的山脉长度 for peak in peaks: left = prev_valley[peak] right = next_valley[peak] if left == -1: left = 0 if right == len(A): right = len(A)-1 current_length = right - left + 1 if current_length > max_length: max_length = current_length return max_length
通过以上优化步骤,我们能够高效地解决数组中的最长山脉问题,确保在各种情况下都能得到正确的结果。
转载地址:http://gqba.baihongyu.com/