代码:
import java.io.*;
class Main{
static int N = 300010;
static BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
static int[] a = new int[N], h = new int[N], s = new int[N];
public static void main(String[] args) throws Exception{
String[] ss = read.readLine().split(" ");
int n = Integer.valueOf(ss[0]), m = Integer.valueOf(ss[1]);
ss = read.readLine().split(" ");
for(int i = 1; i <= n; i++) {
a[i] = Integer.valueOf(ss[i - 1]);
s[i] = s[i - 1] + a[i]; //求前缀和
}
int hh = 0, tt = -1, ans = Integer.MIN_VALUE;
for(int i = 1; i <= n; i++){
if( tt >= hh && i - 1 - h[hh] + 1 > m) hh++;
while(tt >= hh && s[h[tt]] >= s[i - 1]) tt--;
h[++tt] = i - 1; //每次将i - 1的下标入队
ans = Math.max(s[i] - s[h[hh]], ans);
}
System.out.println(ans);
}
}
tql,看y总的没懂的边界问题到你这解决了
好家伙,题目是连续子序列,所以就是子数组这样子
是子序列,不是子数组,为什么还能用前缀和??
区间和一般使用前缀和
不太理解红框里面的意思
是一些边界信息, 注意滑动窗口从i - 1开始就行了,按照自己思路就ok。
我改了下代码,现在应该容易理解点了。
https://www.acwing.com/problem/content/156/ 但是滑动窗口的原题,却是下标从i开始的,就很疑惑。
注意看下前缀和公式, 上图例子写的很清晰, 是求i - m到i - 1的最小值