题目描述
给定一个含有N
个正整数的数组,求出有多少个连续区间(包括单个正整数),它们的和大于等于x
。
输入描述
第一行两个整数N
x
(0 < N <= 100000
,0 <= x <= 10000000
)
第二行有N
个正整数(每个正整数小于等于100
)。
输出描述
输出一个整数,表示所求的个数。
示例一
输入
3 7
3 4 7
输出
4
思路
由于原数组中每一个元素均为正整数,故前缀和数组一定是一个递增数组。 首先,我们计算前缀和数组,然后对于每个前缀和数组中的元素,我们使用二分查找来找到满足条件的最小索引j。
from bisect import bisect_left
from itertools import accumulate
def count_continuous_intervals(n, x, arr):
# 计算前缀和数组
pre_sum_list = [0] + list(accumulate(arr))
count = 0
for i in range(n):
target = pre_sum_list[i] + x
j = bisect_left(pre_sum_list, target)
count += n-j+1
return count
# 示例一
n, x = 3, 7
arr = [3, 4, 7]
print(count_continuous_intervals(n, x, arr)) # 输出应为4
# 示例二
n, x = 10, 10000000
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(count_continuous_intervals(n, x, arr)) # 输出应为0