📜  Array 中每个索引的最长子数组的长度,其中该索引处的元素最大(1)

📅  最后修改于: 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

代码片段中变量的含义已经在思路部分进行了说明。