这周看到了一道经典的算法题,和大家分享一下。
题目:
给定一个数组arr,返回子数组的最大累加和。例如,arr=[1,-2,3,5,-2,6,-1],所有的子数组中,[3,5,-2,6]可以累加出最大的和12,所以返回12。
这道题其实是可以dp的。
我们最笨的办法是穷举出它的所有连续子数组之和,然后比较出最大的那个。
可以看出,在连续穷举的过程中重复了很多计算。既然它是连续的一段和,假设我们已知max是一段数里的最大和,要继续求最大和,必须要加上一个正数,如果不是则从下一个开始累加。所以我们用变量cur来表示当前的累加和,让它和max比较,更新max,然后判断它是不是正数,如果是,继续累加,如果不是,则把它置为0,从下一个数开始记累加值。
由于每个数都只遍历一遍,这种算法的复杂度是O(N).
下面是代码实现:
int maxSubArray(int a[],int n)
{
int cur=0,max=-100000000;//cur记录累加结果,max记录最大累加和
for(int i=0;i<n;i++)
{
cur += a[i];
max = cur>max?cur:max;
cur = cur<0?0:cur;
}
return max;
}