42 连续子数组的最大和

题目

输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和18。

AcWing OJ

C++ 题解

  • 从头到尾逐个累加数组中的每个数字,初始化和为0;(nCurrSum=0,nGreatestNum=int.MinValue)
  • 首先加上第一个数字,从第二个数字开始累加,依次将累加和保存到一个临时变量(nCurrSum)中;
  • 如果当前累加和(nCurrSum)小于0,那抛弃前面的子数组和,从下一个数字开始重新累加;相反,则将当前累加和(nCurrSum)与返回累加和(nGreatestNum)进行比较,如果nCurrSum>nGreatestNum,则更新nGreatestNum。

注意:
对于输入全是负数的数组,我们需要把最大和初始化一个最小的负数,才可以得到结果:

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int length = nums.size();
        if(length == 0)
            return 0;
        
        int currSum = 0;
        // int类型表示负数的范围
        int maxSum = 0x80000000;
        
        for (auto x : nums)
        {
            if(currSum <= 0)
                currSum = x;
            else
                currSum += x;
            
            if(currSum > maxSum)
                maxSum = currSum;
        }
        
        return maxSum;
        
    }
};

python 题解

# -*- coding:utf-8 -*-
class Solution:
    g_InvalidInput=False
    def maxSubArray(self, array):
        # write code here
        if not array or len(array)<=0:
            g_InvalidInput=True
            return 0
        
        g_InvalidInput=False
        curSum=0
        # float('-inf') 表示负无穷
        greatSum=float('-inf')
        for i in array:
            if curSum<=0:
                curSum=i
            else:
                curSum+=i
            if curSum>greatSum:
                greatSum=curSum
        return greatSum
posted @ 2019-01-31 14:21  youngliu91  阅读(101)  评论(0)    收藏  举报