可以参考LeetCode原题: LeetCode 209. 长度最小的子数组
这道题求得不是最小长度,而是方案数,那么每当我们找到一个满足条件的区间[l,r]时,[l,r+1],[l,r+2],...,[l,n−1]也一定是满足条件的,因此对应的方案数就是n−r,其中n为数组长度,使用双指针一边移动一边计数即可。
const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
let n, x;
let w = [];
rl.on('line', (line) => {
    const inputs = line.split(' ').map(Number);
    if (n === undefined) {
        [n, x] = inputs;
    } else {
        w = inputs;
        processInput(n, x, w);
        rl.close();
    }
});
function processInput(n, x, w) {
    let ans = 0;
    let l = 0,
        r = 0;
    let sum = 0;
    while (r < n&&l<=r) {
        sum += w[r];
        while (sum >= x) {
            ans += n - r;
            sum -= w[l];
            l += 1;
        }
        r += 1;
    }
    console.log(ans);
}
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();  // 读取n的值
        int x = scanner.nextInt();  // 读取x的值
        int[] w = new int[n];  // 创建数组w
        long ans = 0;  // 用于统计答案个数
        int l = 0, r = 0;  // 初始化双指针
        int sum = 0;
        // 读取数组w的值
        for (int i = 0; i < n; i++) {
            w[i] = scanner.nextInt();
        }
        // 双指针算法
        while (r < n) {
            sum += w[r];
            while (sum >= x&&l<=r) {
                ans += n - r;
                sum -= w[l];
                l++;
            }
            r++;
        }
        // 输出结果
        System.out.println(ans);
    }
}
#include <iostream>
#include <vector>
using namespace std;
int main() {
    int n, x;
    cin >> n >> x;  // 读取n和x的值
    vector<int> w(n);  // 创建数组w
    long long ans = 0;  // 用于统计答案个数
    int l = 0, r = 0;  // 初始化双指针
    int sum = 0;
    // 读取数组w的值
    for (int i = 0; i < n; i++) {
        cin >> w[i];
    }
    // 双指针算法
    while (r < n) {
        sum += w[r];
        while (sum >= x&&l<=r) {
            ans += n - r;
            sum -= w[l];
            l++;
        }
        r++;
    }
    // 输出结果
    cout << ans << endl;
    return 0;
}
n,x=map(int,input().split())
w=list(map(int,input().split()))
ans=0  #统计答案个数
l,r=0,0 #双指针
sum=0
while r<n:
    sum+=w[r]
    while sum>=x and l<=r:
        ans+=n-r
        sum-=w[l]
        l+=1
    r+=1
print(ans)
        给定一个含有N个正整数的数组,求出有多少连续区间(包括单个正整数),它们的和大于等于 x。
第一行为两个整数 N,x。(0<N≤100000,0≤x≤10000000)
第二行有 N 个正整数 (每个正整数小于等于 100)。
输出一个整数,表示所求的个数
注意:此题对效率有要求,暴力解法通过率不高,请考虑高效的实现方式。
输入
3 7
3 4 7
输出
4
说明:第一行的 3表示第二行数组输入 3个数,第一行的 7是比较数,用于判断连续数组是否大于该数;组合为 3+4; 3+4+7,4+7,7;都大于等于指定的 7;所以共四组。
输入
10 10000
1 2 3 4 5 6 7 8 9 10
输出
0
说明:所有元素的和小于 10000 ,所以返回 0。