小M给你一串含有c个正整数的数组, 想让你帮忙求出有多少个下标的连续区间, 它们的和大于等于x。
输入描述:
第一行两个整数c x(0 < c <= 1000000, 0 <= x <= 100000000)
第二行有c个正整数(每个正整数小于等于100)。
输出描述:
输出一个整数,表示所求的个数。
输入例子1:
3 6
2 4 7
输出例子1:
4
例子1说明:
对于有3个整数构成的数组而言,总共有6个下标连续的区间,他们的和分别为:
2 = 2
4 = 4
7 = 7
2 + 4 = 6
4 + 7 = 11
2 + 4 + 7 = 13
其中有4个和大于等于6,所以答案等于4。
输入例子2:
2 0
2 4
输出例子1:
3
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scaner = new Scanner(System.in);
int n = scaner.nextInt();
int x = scaner.nextInt();
int[] a = new int[n];
for(int i=0;i<n;i++){
a[i] = scaner.nextInt();
}
//滑动窗口算法
long count = 0, sum = 0; //这里要用long,否则无法通过所有测试用例,数值可能超过int上限
int lIndex = 0, rIndex = 0;
while(rIndex < n) {
sum += a[rIndex];
while(sum >= x && lIndex<=rIndex) {//必须得有lIndex<=rIndex,否则当x为0时,会计算错误
count += (n-rIndex);
sum -= a[lIndex];
lIndex++;
}
rIndex++;
}
System.out.println(count);
}
}
网友评论