寻找连续区间-数组连续和-前缀和

题目描述

给定一个含有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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值