ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

单调栈-6119. 元素值大于变化阈值的子数组

2022-07-10 10:35:23  阅读:191  来源: 互联网

标签:span 6119 阈值 nums res stk 数组 threshold 单调


问题描述

给你一个整数数组 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有