795. 区间子数组的个数(Python)

难度:★★★☆☆
类型:数组
方法:逻辑

力扣链接请移步本题传送门
更多力扣中等题的解决方案请移步力扣中等题目录

题目

给定一个元素都是正整数的数组A ,正整数 L 以及 R (L <= R)。

求连续、非空且其中最大元素满足大于等于L 小于等于R的子数组个数。

例如 :
输入:
A = [2, 1, 4, 3]
L = 2
R = 3
输出: 3
解释: 满足条件的子数组: [2], [2, 1], [3].
注意:

L, R 和 A[i] 都是整数,范围在 [0, 10^9]。
数组 A 的长度范围在[1, 50000]。

解答

这道题不难,摘一下官网解答。我们定义一个函数count,函数的输入是一个数字,函数的输出是数组A中,最大值不超过该数字的子数组的个数。

既然题目要求我们找出的子数组中的最大值是在一个区间(L,R),那么可以计算出count(R)和count(L-1),然后做减法即可。这里需要注意,由于编码规则和题目要求缘故,下界需要是L-1。另外需要注意的是,题目限制了子数组的最大值,而没有对最小值进行限制(如果还限制最小值不小于某个阈值,那么这道题更简单了,直接筛选求阶乘就好)。

class Solution(object):
    def numSubarrayBoundedMax(self, A, L, R):
        def count(bound):
            ans = cur = 0
            for x in A:
                cur = cur + 1 if x <= bound else 0
                ans += cur
            return ans
        return count(R) - count(L - 1)

如有疑问或建议,欢迎评论区留言~

有关更多力扣中等题的python解决方案,请移步力扣中等题解析

你可能感兴趣的:(795. 区间子数组的个数(Python))