求子数组的最大和
题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。
题目只要求连续最大子段和,这很简单,扫描一遍整个数组,将数组元素一个个加起来,如果大于当前最大和,则更新最大和,否则不更新,如果最大和变为负数,则将最大和置零,因为连续最大子段和不可能包含使当前最大和为负的元素。
#include <iostream> using namespace std; int getMaxSum(int num[],int n) { int sum,max; sum = max = 0; for(int i = 0;i < n;i++) { sum+=num[i]; if(sum > max)max = sum; if(sum < 0)sum = 0; } return max; } int main() { int a[10] = {1,-8,6,3,-1,5,7,-2,0,1}; cout<<getMaxSum(a,10)<<endl; system("pause"); return 0; }
2011年10月04日 15:26
Programming Pearls 第八章讲的经典例子呀!感觉这种题还是得费一些时间的,不知道是不是现在获取知识更容易了,还是我们的大脑比前辈更NB了,这种算法还是在研讨会上一个统计学家提出的。当时那些大牛才达到了O(nlgn).
2011年10月05日 13:00
@seaslee:应该是说现在想问题更深了,这种题的话一看到首先想的肯定是DP,呵呵。