给定一个元素都是正整数的数组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]。
'''
给定一个元素都是正整数的数组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]。
'''
class Statistical_subarray(object):
def record_index(self, A, L, R):
'''
该函数用以记录L、R范围内的值可以产生的子数组个数
A 是一个正整数的数组
L 是一个正整数
R 是一个正整数且R>L
'''
index_dictionary = {}
total = 0
for i, num in enumerate(A):
n, m = 0, 0 # 用来记录前后各有多少小于num的数
if num >= L and num <= R:
j, k = i - 1, i + 1
while j >= 0:
if A[j] <= num:
j = j - 1
n = n + 1 # 记录num前小于他并连续的元素的个数
else:
break
while k <= len(A) - 1:
if A[k] <= num:
k = k + 1
m = m + 1 # 记录num后小于他并连续的元素的个数
else:
break
index_dictionary[num] = (m + 1) * (n + 1)
total = total + (m + 1) * (n + 1)
return total
def numSubarrayBoundedMax(self, A, L, R):
"""
:type A: List[int]
:type L: int
:type R: int
:rtype: int
"""
n = len(A)
res = 0
tmp = 0
first = 0
for i in range(n):
if A[i] > R:
first = i + 1
tmp = 0
continue
elif A[i] >= L and A[i] <= R:
tmp = i - first + 1
res += tmp
else:
if tmp > 0:
res += tmp
return res
if __name__ == "__main__":
A = [2, 1, 4, 5, 6, 7, 3]
L = 2
R = 4
C = Statistical_subarray()
D = C.record_index(A, L, R)
E = C.numSubarrayBoundedMax(A, L, R)
print("输出:", D)
print("csdn的答案输出:", E)
这是两种想法的解答,第一种是我自己编写的,第二种是看的csdn的答案取自该链接:https://blog.youkuaiyun.com/Cold_Sun_/article/details/100763932