跳转至

3255. 长度为 K 的子数组的能量值 II

题目描述

关联:

题目描述

给你一个长度为 n 的整数数组 nums 和一个正整数 k

一个数组的 能量值 定义为:

  • 如果 所有 元素都是依次 连续上升 的,那么能量值为 最大 的元素。
  • 否则为 -1

你需要求出 nums 中所有长度为 k子数组 的能量值。

请你返回一个长度为 n - k + 1 的整数数组 results,其中 results[i] 是子数组 nums[i..(i + k - 1)] 的能量值。

本题和 3254. 长度为 K 的子数组的能量值 I 的区别在于,本题的数据量更大。

\(1 \leq n = \text{nums.length}\leq 10^5\)

\(1 \leq \text{nums}[i] \leq 10^5\)

\(1 \leq k \leq n\)

完整题解

3254. 长度为 K 的子数组的能量值 I 的题解依旧可以用于本题,并且时间上还不错。

from collections import deque

class Solution:
    def resultsArray(self, nums: list[int], k: int) -> list[int]:
        n = len(nums)
        results = []
        invalid = deque()

        if k == 1:
            return nums

        for i in range(n - 1):
            if nums[i] + 1 != nums[i + 1]:
                invalid.append(i)

        i = 0
        while i <= n - k:  # [0..k] ~ [n-k..n]

            if not invalid or i + k - 1 <= invalid[0]:
                results.append(nums[i + k - 1])
                i += 1

            else:
                next_start = invalid.popleft() + 1
                # 跳过了几个值,就添加几个 -1,跳过的时候要随时检查右边界 i + k 不能超过 n
                while i < next_start and i <= n - k:  
                    results.append(-1)
                    i += 1
                i = next_start

        return results

复杂度分析

时间复杂度 \(O(n)\),空间复杂度 \(O(n)\)

评论