单调栈-6119. 元素值大于变化阈值的子数组
作者:互联网
问题描述
给你一个整数数组 nums 和一个整数 threshold 。
找到长度为 k 的 nums 子数组,满足数组中 每个 元素都 大于 threshold / k 。
请你返回满足要求的 任意 子数组的 大小 。如果没有这样的子数组,返回 -1 。
子数组 是数组中一段连续非空的元素序列。
示例 1:
输入:nums = [1,3,4,3,1], threshold = 6
输出:3
解释:子数组 [3,4,3] 大小为 3 ,每个元素都大于 6 / 3 = 2 。
注意这是唯一合法的子数组。
示例 2:
输入:nums = [6,5,6,5,8], threshold = 7
输出:1
解释:子数组 [8] 大小为 1 ,且 8 > 7 / 1 = 7 。所以返回 1 。
注意子数组 [6,5] 大小为 2 ,每个元素都大于 7 / 2 = 3.5 。
类似的,子数组 [6,5,6] ,[6,5,6,5] ,[6,5,6,5,8] 都是符合条件的子数组。
所以返回 2, 3, 4 和 5 都可以。
提示:
1 <= nums.length <= 105
1 <= nums[i], threshold <= 109
问题求解
由于区间内所有数字都需要满足nums[i] > thres / k,等价于最小值满足上述的情况,因此我们只需要去寻找每个元素作为最小值的最大span即可,而这个可以通过单调栈进行高效求解。
class Solution:
def validSubarraySize(self, nums: List[int], threshold: int) -> int:
n = len(nums)
left = [0] * n
stk = []
for i in range(n):
while stk and nums[stk[-1]] >= nums[i]:
stk.pop()
left[i] = stk[-1] if stk else -1
stk.append(i)
right = [0] * n
stk = []
for i in range(n - 1, -1, -1):
while stk and nums[stk[-1]] >= nums[i]:
stk.pop()
right[i] = stk[-1] if stk else n
stk.append(i)
res = -1
for i in range(n):
span = right[i] - left[i] - 1
if nums[i] > threshold / span:
res = max(res, span)
return res
标签:span,6119,阈值,nums,res,stk,数组,threshold,单调 来源: https://www.cnblogs.com/hyserendipity/p/16462683.html