连续子数组的最大和

来源:互联网 发布:微信授权回调域名备案 编辑:程序博客网 时间:2024/06/04 23:46

题目:输入一个整形数组,数组里面有正数也有负数。数组中一个或连续的多个正数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度O(n)


解法一:根据数组的规律
从头到尾逐个累加数组中的每个数字。若累加后当前和为负数,则赋值当前和为下一个元素,否则,比较当前和与最大子数组和,若当前和更大则赋值最大子数组和为当前和。
/*输入一个整形数组,求连续子数组的最大和*/#include<iostream>#include<vector>using namespace std;bool g_InvalidInput = false;int FindMaxSumofSubArray(vector<int>& data){if(data.size() == 0){g_InvalidInput = true;return 0;}int curretSum = 0;int maxSum = data[0];for(int i = 0; i < data.size(); i++){if(curretSum < 0)curretSum = data[i];elsecurretSum += data[i];if(curretSum > maxSum)maxSum = curretSum;}return maxSum;}int main(){vector<int> data;int a[8]={1,-2,3,10,-4,7,2,-5};for(int i = 0;i < 8; i++)data.push_back(a[i]);cout<<FindMaxSumofSubArray(data)<<endl;return 0;}

解法二:动态规划
用函数f(i)表示第i个数字结尾的子数组的最大和,那么我们需要求出max[f(i)]
f(i) = data[i]       i = 0 或者 f(i-1) <=0
f(i) = f(i-1) + data[i]  i != 0 并且 f(i-1) > 0


0 0