首页 > 代码库 > 前缀和的应用
前缀和的应用
Q:对于一个连续的数组,求其任意连续的子数组和的最大值。
分析:
1.对于此题,直接应用暴力求解的话,时间复杂度应为O(n^2).
2.此处应用时间复杂度为O(n)的算法来求解,即前缀和的处理。
首先,函数sum(i,j)表示数组从下标i到下标j的连续元素的和。容易想到:sum(i,j) = sum(0,j) - sum(0,i-1).所以求sum(i,j)的最大值就可以表示为求sum(0,j) - sum(0,i-1)
的最大值问题。显然sum(0,j)的时间复杂度为线性的。只需求出最大的sum(0,j)与最小的sum(0,i-1),(其中j >= i)两者之差即所求结果。
代码如下:
//数组前缀和的处理 #include <stdio.h> int a[]={1,2,3,-1,-2,5,6}; int sum(int* arr) { int m,max = 0,sum = 0,min = a[0]; int len = sizeof(a) / 4; int i = 0,j = 0; for( m = 0; m < len; m++) { sum += a[m]; if((sum > max)&&(j >= i)) { max = sum; j = m; } if((sum < min) && (i <= j)) { min = sum; i = m; } } if(i == 0) min = 0;//对于i=0时的处理 return max - min; } int main() { printf("寻找数组a的最大连续子数组和:\n"); int res; res = sum(a); printf("结果为:%d\n",res); }
运行结果:
前缀和的应用
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。