LC 6119. 元素值大于变化阈值的子数组
这提的思路就是,对于 `A[i]` 来说,如果它是最小值,那么它左右可以覆盖的范围是多少。假设我们对于左边进行考虑
- 如果 A[i] <= A[j], 而 A[j] 覆盖的范围是 l, 那么A[i]至少可以覆盖到l. 那么A[i] 继续和 A[l]进行比较
- 如果 A[i] > A[l], 那么 A[i] 覆盖的范围就是到 l.
这个算法我不知道具体时间复杂度是多少,可能会遇到某些极端情况,但是对于递增/递减序列都可以很容易应对。
class Solution: def validSubarraySize(self, nums: List[int], threshold: int) -> int: n = len(nums) A = [-1] * n for i in range(1, n): j = i - 1 while j >= 0 and nums[i] <= nums[j]: j = A[j] A[i] = j B = [n] * n for i in reversed(range(n - 1)): j = i + 1 while j < n and nums[i] <= nums[j]: j = B[j] B[i] = j for i in range(n): sz = B[i] - A[i] - 1 if nums[i] * sz > threshold: return sz return -1