zoukankan      html  css  js  c++  java
  • 【剑指offer】面试题31:连续子数组的最大和

    题目:

    在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。

    思路:

    保存两个值:当前和sum、最大和max。当sum小于等于0时,置sum为当前值;否则将当前值加到sum上。每次sum和max比较,更新max。

    另外,动态规划的思路代码和这里一样。动态规划就是考虑 f(i) 和 f(i-1) 之间的关系。

    注意:

    需要注意的就是,sum和max初始值的设定,特别是max的初始值。max初始值不能设置为0,因为输入可能全为负数,应该是 int 的最小值 0x80000000。或者将sum和max初始化为下标为0的元素的值。

    另外,需要判断输入数组的个数。

    代码:

    class Solution {
    public:
        int FindGreatestSumOfSubArray(vector<int> array) {
            if(array.size()<=0)  return 0;
            
            int max=array[0];
            int sum=array[0];
            for(int i=1;i<array.size();++i)
            {
                if(sum<=0)  sum=array[i];
                else sum+=array[i];
                
                max=max>sum?max:sum;
            }
            
            return max;
        }
    };
  • 相关阅读:
    解题:POI 2009 TAB
    解题:POI 2015 Pieczęć
    解题:POI 2013 Taxis
    解题:POI 2015 Kinoman
    题目1012:畅通工程(并查集)
    并查集深入分析
    题目1186:打印日期(日期计算)
    C/C++如何整行读入字符串?
    四种方法解决最大连续子序列和问题
    题目1011:最大连续子序列
  • 原文地址:https://www.cnblogs.com/buxizhizhou/p/4722354.html
Copyright © 2011-2022 走看看