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

本题来自《剑指offer》 连续子数组的最大和

题目:

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

思路:

   采用动态规划的思想

    如果是第一次,那么该值便就是当前值。或者当前面的值小于0时候,也会保存当前的值

    如果当前的值大于0,并且非第一个数字时候,那么就累加。

    累计求和,每次都将最大的值保存起来,最后返回最大的值即可。

C++ Code:

class Solution {
public:
    int FindGreatestSumOfSubArray(vector<int> array) {
        if (array.size()<=0){                    //边界条件,当原始数组不存在时候,直接返回0
            return 0;
        }
        int sum = 0;                             //中间值累计求和
        int greatest = 0x80000000;               //负无穷
        int length = array.size();               //原书数组的长度
        for (int i=0;i<length;i++){
            if (sum<=0){                         //如果累计求和小于0,说明前面的累加都小于0,便将当前的值重新赋予
                sum = array[i];
            }else{                               //否则累加当前的值
                sum += array[i];
            }
            if (sum > greatest){                 //如果累加的中间值大于负无穷
                greatest = sum;                  //每次都将最大的值保存起来
            }
        }
        return greatest;                         //最后返回最大的值
    }
};

Python Code:

总结:

原文地址:https://www.cnblogs.com/missidiot/p/10783661.html