最大连续和
写了一个最大连续和的题目,好久没写了。。。
想想最大连续和有好多种写法、
应该有O(n^2)的,O(nlogn)的 和 O(n)的!
O(n^2)的很简单,就不说了。。。
O(nlogn)的是用分治法,好复杂的说,没写过,也不会写……
O(n)的算法还是比较巧妙的,在此复习一下:
算法流程:
1、先预处理一个数组s[Max] , s[i] = s[i - 1] + a[i];
2、我们知道,当j确定时,“s[j] - s[i - 1]最大”的条件是s[i - 1]要最小!
因此我们只要扫描一次数组s,维护一个“目前遇到过的最小s”即可。
代码:
for(int i = 1; i <= n; i ++)
{
if(s[i] - min > max) max = s[i] - min;
if(s[i] < min) min = s[i];
}
3、输出max即为答案
1 #include <cstdio> 2 3 int a[250500], s[250500], n; 4 5 int main() 6 { 7 while(scanf("%d" , &n)) 8 { 9 if (n == 0) break; 10 for(int i = 1; i <= n; i ++) scanf("%d",&a[i]); 11 12 s[0] = 0; 13 for(int i = 1; i <= n; i ++) s[i] = s[i-1] + a[i]; 14 15 int max = -(1 << 30); 16 int min = s[0]; 17 for(int i = 1; i <= n; i ++) 18 { 19 if(s[i] - min > max) max = s[i] - min; 20 if(s[i] < min) min = s[i]; 21 } 22 23 printf("%d\n" , max); 24 } 25 return 0; 26 }