《剑指Offer》-42.连续子数组的最大和

题干

输入一个整形数组,数组里有正数也有负数。数组中的一个或连续多个正数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。

解题思路

思路一

从头到尾逐个累加数字,初始化和为0,当和为负数时丢弃和,使用下一个数字赋值,和为正数时继续累加,每次累加都与最大值进行比较,如果大于最大值,则替换,直到遍历完后,得到连续累加和的最大值。

思路二

使用动态规划的思想进行分析,f(i) = pData[i] if i=0 or f(i-1) <=0 else f(i-1)+pData[i] if i!=0 and f(i-1)>0

代码实现

思路一

<?php
/**
 * 顺序累加的方式求最大和
 */

/**
 * @param $numbers
 */
function getGreatestSumOfSubArray($numbers)
{
    if (empty($numbers)) {
        return;
    }

    $sum = 0;
    $max = PHP_INT_MIN;

    $len = count($numbers);
    for ($i = 0; $i < $len; $i++) {
        if ($sum <= 0) {
            $sum = $numbers[$i];
        } else {
            $sum += $numbers[$i];
        }

        if ($sum > $max) {
            $max = $sum;
        }
    }

    return $max;
}

echo getGreatestSumOfSubArray([1, -2, 3, 10, -4, 7, 2, -5]);
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,195评论 0 13
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,391评论 0 2
  • 对于我来说,成长最大的悲哀就在于不得不经历那些让你痛苦的人和感情吧
    踽踽独行77阅读 122评论 0 0
  • 最近写的《花语》专题,是了结了我的心愿。因为本人特别喜欢张爱玲对爱情的感悟,所以一直去感悟大师的笔墨。 ...
    囚青鸟阅读 307评论 0 2
  • 其实,眼前的情形也是意料之中的,但在我亲身面对时,却想撂担子。 犹记得刚听到语文老师请假时那如羊儿拥有整个任其奔腾...
    枫酿阅读 296评论 0 0