连续子数组的最大和
给一个整型数组,数组有正有负,一个或连续多个整数为一个子数组,求所有子数组中数组和最大是多少(那个子数组可否求出?),时间复杂度为O(N)
方法一:数组特征,从第一位开始往后累加,比较每次累加后的最大值并记录,直至累加和小于等于0时(该部分已无增长能力,也就是说从前一个开始节点到当前节点的累加和,不比当前节点开始的大),下一位重起累加,操作同上,直至结束
方法二:动态规划,根据特征找出最优子结构,特别重要。记录到第n个数Xn时累加和f(n),f(n)与f(n-1)的是否满足最优子结构,如果f(n-1)<=0,即f(n-1)为副作用,f(n)=Xn,否则f(n)=f(n-1)+Xn,再Max(f(n))
解法一:
int FindGreatestSumOfSubArray(int *pData, int nLength)//diy
{
if (pData == nullptr || nLength <= 0) return 0;
int max = pData[0];
int tempsum = 0;
for (int i = 0; i < nLength;i++)
{
tempsum += pData[i];
if (tempsum>max)
max = tempsum;
if (tempsum <= 0)
tempsum = 0;
}
return max;
}
解法二:
int FindGreatestSumOfSubArray_dynamic(int *pData, int nLength)//diy,dynamic
{
if (pData == nullptr || nLength <= 0) return 0;
int* f = new int[nLength]();
f[0] = pData[0];
int max = f[0];
for (int i = 1; i < nLength;i++)
{
if (f[i - 1] <= 0)
f[i] = pData[i];
else
f[i] = f[i - 1] + pData[i];
max = f[i]>max ? f[i] : max;
}
return max;
}