其他分享
首页 > 其他分享> > 单调栈-6119. 元素值大于变化阈值的子数组

单调栈-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