连续子区间和
描述
一串含有 c 个正整数的数组,求出有多少个下标的连续区间,它们的和大于等于
x
第一行两个整数 c x
第二行有 c 个正整数
输出一个整数,表示所求的个数
3 6
2 4 7
输出:4
对于有 3 个整数构成的数组而言,总共有 6 个下标连续的区间,他们的和分别
为:
2 = 2
4 = 4
7 = 7
2 + 4 = 6
4 + 7 = 11
2 + 4 + 7 = 13
其中有 4 个和大于等于 6,所以答案等于 4
法一
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int num = sc.nextInt();
int target = sc.nextInt();
int[] arr = new int[num];
for (int i = 0 ; i < num ; i++) {
arr[i] = sc.nextInt();
}
int sum = 0;
int right = 0, left = 0;
int count = 0;
//首先是循环在一个滑动窗口
while (right < num) {
//然后从左边开始加,但凡大于target就可以计数
sum += arr[right];
while (sum >= target) {
if (sum >= target) {
count += num - right;//这里的意思是往后越大的数也成立
}
sum -= arr[left];//这是为了保证连续,不可以跳跃相加
left++;
}
//当其不大于target时,继续加下一个大的数
right++;
}
System.out.println(count);
}
}
}
算法实现
先找到子区间是刚好大于x的,由于都是正数,因此右边的个数全部加进来。
问题转化为求数组的连续子区间使得刚好大于x,使用滑动窗口的方法。
比如说,但凡加到2 + 4 已经是大于target(6) ,那么此时存在的滑动窗口就是 [2 4] 以及窗口右边延申为 [2 4 7]
再比如,如果是[4 7],这个滑动窗口满足大于等于target(6),那么此时,把窗口左边缩减为[7] ,也是满足,最后总共满足条件的窗口就有四个