给定一个整型数组arr,和一个整数num。某个arr中的子数组sub,如果想达标,必须满足:sub中最大值 – sub中最小值 <= num,返回arr中达标子数组的数量。
注意:子数组必须连续。
acm模式:
输入为:
8
4 1 1 12 5 9
思路:
大数组如果达标,子数组必达标。
暴力解为o(n^3)次方
子数组不达标,那么大数组肯定也不达标
num = int(input().strip())
arr = list(map(int, input().strip().split(" ")))
length = len(arr)
from collections import deque
qmin = deque() # 单调递增的双端队列,也叫单调增队列
qmax = deque() # 单调递减的双端队列
res = 0
if length == 0:
print(0)
pass
# 子数组开头,也就是L
r = 0
l = 0
while l < length:
# 首先要保证队列的队列头不可以在滑窗之外
while qmax and qmax[0] < l:
qmax.popleft()
while qmin and qmin[0] < l:
qmin.popleft()
while l <= r and r < length:
while qmax and arr[r] >= arr[qmax[-1]]:
qmax.pop()
qmax.append(r)
max = arr[qmax[0]]
while qmin and arr[r] <= arr[qmin[-1]]:
qmin.pop()
qmin.append(r)
min = arr[qmin[0]]
if max - min > num:
break
r += 1
res += (r-1-l+1) * (r-1-l+1+1) * 0.5
l = r
print(res)