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

浙公网安备 33010602011771号