题目描述
输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n).
输入输出
输入:[1,-2,3,10,-4,7,2,-5]
返回值:18
说明:
输入的数组为{1,-2,3,10,—4,7,2,一5},和最大的子数组为{3,10,一4,7,2},因此输出为该子数组的和 18。
解题思路
- 循环遍历数组中的数字,连续数相加的和如果比当前遍历的数还小,则从当前遍历的数重新开始加和计算,否则,之前数字的和继续加上当前遍历的数字;
- 比较当前保存的最大值与当前计算的加和的结果,如果最大值比当前加和的值小,则替换最大值,否则直接返回最大值。
代码示例
# coding:utf-8
class Solution:
def FindGreatSumOfSubArray(self, array):
# 创建一个变量,用来保存最大值,初始值为None
maxNum = None
# 创建一个变量,用来保存每次遍历连续数的和,初始化为0
tmpSum = 0
# 循环遍历传入放入数组
for i in array:
# 如果当前最大值为空,则直接将当前遍历的值作为最大值存入
if maxNum == None:
maxNum = 0
# 进行累加和并计算每次的累加和与当前数的大小
# 如果累加和加上当前的数反而比当前的数更小,
# 则从更大的(当前遍历的数)重新开始计算累加和
if tmpSum+i < i:
tmpSum = i
# 如果累加的和大于当前的数,则继续累加
else:
tmpSum += i
# 每次计算和之后,比较当前的累加和与当前最大值的大小
# 如果当前累加和的结果大于最大值,则需要对最大值重新赋值
if maxNum < tmpSum:
maxNum = tmpSum
return maxNum
if __name__ == '__main__':
array = [6, -3, -2, 7, -15, 1, 2, 2]
s = Solution()
res = s.FindGreatSumOfSubArray(array)
print(res)