题目描述
HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)
解题思路
如果我们有个序列{1,-2,3},显然最大子序列是{3},如果我们在这个序列后面再加入一个数t,我们怎么去求加入一个数之后新的序列的连续子序列{1,-2,3,t}的最大和?
设以t为序列尾的最大子序列和为sum,则我们可以很直观地看出sum=max{3+t,t},这样理解起来很简单,因为3就在t前面,而我们已经知道以3为结尾的最大连续子序列和就是3,这个3就是t绕不过去的一个坑。
知道这个关系后我们就可以由题目推出这样一个式子;
设F[n]为下标为n结尾的连续子序列最大和,数组名为num
推出:F[n]=max{F[n-1]+num[n]}
代码实现
class Solution {
public:int GetMax(int a,int b){return a>b?a:b;}int FindGreatestSumOfSubArray(vector<int> array) {if(array.empty())return 0;int sum = array[0];int max = array[0];for(int i= 1; i< array.size();++i){max = GetMax(max+array[i],array[i]);sum = GetMax(sum,max);}return sum;}
};