剑指offer之连续子数组的最大和

版权声明:所有的博客都是作为个人笔记的。。。。。。 https://blog.csdn.net/qq_35976351/article/details/82986928

题目描述

HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)

解题思路

废话连篇的题目。。。。。

暴力法 O ( N 2 ) O(N^2) ,归并法 O ( N log N ) O(N\log N) ,动态规划时线性时间的 O ( N ) O(N) 。这里使用动态规划。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;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_35976351/article/details/82986928