Python剑指offer 连续子数组的最大和

题目描述

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值