版权声明:所有的博客都是作为个人笔记的。。。。。。 https://blog.csdn.net/qq_35976351/article/details/82986928
题目描述
HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)
解题思路
废话连篇的题目。。。。。
暴力法 ,归并法 ,动态规划时线性时间的 。这里使用动态规划。sum表示当前已经求出的最长子序列的和,curSum表示正在计算的子序列的和。如果curSum加上一个元素后,大于当前的序列,那么就进行更新;如果加上一个元素后,curSum仍然是负数,有两种情况:
- sum>=0的情况时,curSum添加这个数据后,不能递增了,因此要重新归零
- sum<0时,说明始终没有遇到正数,因此不能归零,否则会更替掉sum的正确值;因此只能保留当前的数据array[i]
AC代码
class Solution {
public:
int FindGreatestSumOfSubArray(vector<int> array) {
int curSum = array[0]; // 当前状态最大和
int sum = array[0]; // 结果的最大和
int len = array.size();
for(int i = 1; i < len; ++i) {
curSum += array[i];
if(curSum < 0) {
if(sum >= 0) { // 如果sum>=0,说明有非负值在序列中
curSum = 0;
} else { // 只能标定当前的点
curSum = array[i];
}
}
if(curSum > sum) {
sum = curSum;
}
}
return sum;
}
};