难度:★★★☆☆
类型:数组
方法:逻辑
力扣链接请移步本题传送门
更多力扣中等题的解决方案请移步力扣中等题目录
题目
给定一个元素都是正整数的数组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解决方案,请移步力扣中等题解析