📅  最后修改于: 2023-12-03 15:13:29.567000             🧑  作者: Mango
给定一个整数数组nums,找到每个元素的最长子数组长度,使得该元素是该子数组中最大的元素。如果不存在这样的子数组,则将其长度设置为0。
输入:nums = [5,2,1,2,5,2,1,2,5]
输出:[2,1,1,1,2,1,1,1,2]
解释:
对于每个索引 i:
- i = 0,最长的子数组是 [5,2],长度为 2。
- i = 1,最长的子数组是 [2],长度为 1。
- i = 2,最长的子数组是 [1],长度为 1。
- i = 3,最长的子数组是 [2],长度为 1。
- i = 4,最长的子数组是 [5,2,1,2,5,2,1,2,5],长度为 2。
- i = 5,最长的子数组是 [2],长度为 1。
- i = 6,最长的子数组是 [1],长度为 1。
- i = 7,最长的子数组是 [2],长度为 1。
- i = 8,最长的子数组是 [5,2,1,2,5,2,1,2,5],长度为 2。
遍历数组nums,对于每个元素nums[i],向左和向右分别找到第一个小于nums[i]的元素的下标left和right,则以nums[i]为最大值的最长子数组为nums[left+1:right],其长度为right-left-1。
from typing import List
def longest_subarray(nums: List[int]) -> List[int]:
n = len(nums)
res = [0] * n
for i in range(n):
left, right = i-1, i+1
while left >= 0 and nums[left] < nums[i]:
left -= 1
while right < n and nums[right] < nums[i]:
right += 1
res[i] = right - left - 1
return res
代码片段中变量的含义已经在思路部分进行了说明。