如题,给一个数组A,求这个数组的子数组之和的最大值。注意:这里的子数组为连续的,只需要求和,不需要返回子数组的具体位置。
根据书上的解法3,用startNum表示连续子数组的开始值,用maxSum表示子数组之和的最大值,二者均初始化为A[0],然后通过遍历数组A,不断更新startNum和maxSum,最终返回maxSum。
代码如下:
#include <vector>
#include <iostream>
using namespace std;
int max(int a, int b)
{
return a > b ? a : b;
}
int MaxSum(vector<int>v)
{
if (v.empty())
return -1;
int len = v.size();
if (len == 1)
return v[0];
int startNum = v[0];
int maxSum = v[0];
for (int i = 1; i < len; i++)
{
startNum = max(v[i], startNum + v[i]);
maxSum = max(maxSum, startNum);
}
return maxSum;
}
int main(void)
{
vector<int>v1 = { 1, -2, 3, 5, -3, 2 };
vector<int>v2 = { 0, -2, 3, 5, -1, 2 };
vector<int>v3 = { -9, -2, -3, -5, -3};
int r1 = MaxSum(v1);
int r2 = MaxSum(v2);
int r3 = MaxSum(v3);
return 0;
}