题目描述
HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)。时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
解题思路
我们首先考虑一下什么时候才是连续子数组的最大和。可以先让第一个数与第二个数相加,然后和第二个数本身进行比较,如果第一个数与第二个数的和比第二个数本身要小,那么不如直接丢弃第一个数,直接从第二个数开始向后加这样得到的和会更大,后面以此类推遍历整个数组这样进行比较,并把当前最大数记录下来与数组的第一个数进行比较,返回最大值 。
- 1、先定义两个变量maxNum开始假设数组的第一个元素就是最大值,即maxNum = array[0];curNum = 0。
- 2、然后遍历整个数组进行比较,如果当前的和与数组的第 i 个元素相加小于第 i 个元素,说明前面已加的和不如直接从第 i 个元素开始加得到的数大,那么不如就丢弃前面的和直接从第 i 个元素开始重新往后加。最后比较当前已加的和与开始定义的maxNum比较,返回最大的那个即可。
# -*- coding:utf-8 -*-
class Solution:
def FindGreatestSumOfSubArray(self, array):
# write code here
maxNum = array[0]
curNum = 0
for i in array:
#if maxNum == None:
# maxNum = i
if curNum + i < i:
curNum = i
else:
curNum += i
if maxNum < curNum:
maxNum = curNum
return maxNum