最大连续子数组算法学习

作为零基础学习的弱智艰难的入行后,在黑暗中摸爬滚打中过了几个月,才想起应该开个博客记录下自己的学习历程和整理知识点。刚刚接触算法的我,博客就以记录我的算法学习历程为开端吧。多说无益,下面开始:

如果已知后三十天的股票涨跌停的情况,那么我该如何确定自己收益的最大值是多少呢?这里可以将股票每天的变化存进一个数组里,涨记为正,跌记为负,那么最后这个实际问题就转化为了求最大连续子数组的问题了,即我怎么切割这个数组使得这个数组里的值最大?这里简单的用了分治法去计算,首先将data分成2份,一份为左data,一份为右data,那么就可以通过循环求出左右data各自的最大值,先求左边数组(以下为python代码)

    #left array
    mid = len(data)/2
    ssum = 0
    sumLeft = 0
    leftData = data[:mid]
    leftIndex = 0
    for i in range(len(leftData)-1,-1,-1):
        ssum = ssum + leftData[i]
        if ssum > sumLeft:
            sumLeft = ssum
            leftIndex = i

mid为data的中点,用mid把data分成2份,左边数组为leftData,利用ssum计算左数组中的累加值,leftData存累加的最大值。如果累加值大于了最大值,那么就把这个累加值存为最大值。右边数组同理

    #right array
    sumRight = 0
    ssum = 0
    rightData = data[mid:]
    rightIndex = 0
    for j in range(len(rightData)):
        ssum = ssum +rightData[j]
        if ssum > sumRight:
            sumRight = ssum
            rightIndex = j

这样就能算出左右2边的最大连续子数组啦,是不是相互比较之后返回较大那个就Ok了呢?没有,原来忽略了一个,就是假如这个最大子数组跨过了中点mid呢?我们还得把这个数组的最大子数组取出来一起比较:

    crossData = data[leftIndex:rightIndex + mid + 1]
    sumCross = 0
    ssum = 0
    crossIndex = 0
    for x in range(len(crossData)):
        ssum = ssum + crossData[x]
        if ssum > sumCross:
            sumCross = ssum
            crossIndex = x

之前用i,j 分别记录了左数组的最大值索引i,和右数组的最大值索引j,那么可以想到这个cross数组必然在i,j这2个边界内,因为这2个已经是2边的最大值了,如果再加超出边界部分的值一定是小于最大值的。

所以可以把data切割为crossData,这里要注意j因为是右边数组,所以j在整个data中应该还需要加上中点的值才能真正获取到crossData的右边界,因为切割的时候不包含最后的j,为了把右边界算进去,还必须加上1

之后按照之前的套路,求出crossData的最大值 sumCross

好了,接下来这3个值进行比较返回最大的就可以了

maxSum = max(sumRight,sumLeft,sumCross)

由于刚学,算法还有很多可以改进的地方,只能一步一步来了。

时间: 2024-08-04 04:27:10

最大连续子数组算法学习的相关文章

[算法导论]4.1-5最大连续子数组问题

在线性时间内非递归的求数组的最大连续子数组(连续和最大的子数组). 题目给出思路为数组A[1...j+1]的最大和子数组,有两种情况:a) A[1...j]的最大和子数组; b) 某个A[i...j+1]的最大和子数组,但思考很久没有理解如何用这个思路设计线性时间算法,希望有人能给予指点. (i点是使A[1]+..+A[i]为负的一个值?) 目前的思路是,最大子数组一定位于从某个正数开始,全部求和<=0的一段数组中 从其实点i到目标点j,从第一个正数开始截取尽量长的一段数组,从第一个正数起的最大

编程算法 - 连续子数组的最大和 代码(C)

连续子数组的最大和 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一个整型数组, 数组里有正数也有负数. 数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值. 使用一个数保存当前和, 如果当前和为小于0,  则替换新值, 否则, 递加, 使用一个数保存临时最大值. 代码: /* * main.cpp * * Created on: 2014年6月29日 * Author: wang */ #include <stdio

笔试算法题(06):最大连续子数组和 &amp; 二叉树路径和值

出题:预先输入一个整型数组,数组中有正数也有负数:数组中连续一个或者多个整数组成一个子数组,每个子数组有一个和:求所有子数组中和的最大值,要求时间复杂度O(n): 分析: 时间复杂度为线性表明只允许一遍扫描,当然如果最终的最大值为0表明所有元素都是负数,可以用线性时间O(N)查找最大的元素.具体算法策略请见代码和注释: 子数组的起始元素肯定是非负数,如果添加的元素为正数则记录最大和值并且继续添加:如果添加的元素为负数,则判断新的和是否大于0,如果小于0则以下一个元素作为起始元素重新开始,如果大于

最大连续子数组和算法

求最大连续子数组和问题 sample input: -1,4,-3,6,-20,4,-2,5 sample output: 7 最容易想到的就是暴力解决方法,穷举所有连续子数组的可能性,进行比较,复杂度O(n2) 代码略 复杂度为O(n)的算法: 如果arr[0]的值大于0,将max赋值为arr[0],否则赋值为0 读取下一项,累加到sum,如果sum>0,且如果sum>max,将max更新为sum的值,如果sum<0,将sum赋值为0 重复(2)直至最后一项,所得max即为所求. 代码

最大连续子数组和算法(动态规划解释)

之前在其他博客看到了,但是算法的关键部分完全看不懂为什么要这么做,直到最近上算法课,才终于知道到底怎么来的. 问题描述: 给出一个数组,求其最大连续子数组和 例:数组{1,2,3,4,-5,10,-1,-1}的最大连续子数组和是子数组{1,2,3,4,-5,10}的和15 算法过程: 这个算法能从零直接想出来的人是真的厉害,我并不可以,所以我直接描述一下这个算法是怎么算的,而不描述怎么想到的了 首先我们把原来数组记做a,然后最关键的一步,我们需要一个等长的数组b,b[j]的含义是以下一系列和中的

经典算法——连续子数组最大和问题

Find the contiguous subarray within an array (containing at least one number) which has the largest sum. For example, given the array [?2,1,?3,4,?1,2,1,?5,4], the contiguous subarray [4,?1,2,1] has the largest sum = 6. 一.问题描述:输入一个整数数组,求数组中连续的子数组使其和最大

【剑指Offer学习】【面试题31:连续子数组的最大和】

题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n). 例子说明: 例如输入的数组为{1, -2, 3, 10, -4, 7, 2, -5},和最大的子数组为{3, 10, -4, 7, 2}.因此输出为该子数组的和18 . 解题思路: 解法一:举例分析数组的规律. 我们试着从头到尾逐个累加示例数组中的每个数字.初始化和为0.第一步加上第一个数字1, 此时和为1.接下来第二步加上数字-2,和就变成了-1.第三步

[算法导论]练习4.1-5最大连续子数组问题

题目:在线性时间内非递归的求数组的最大连续子数组(连续和最大的子数组). 思路:设最大子数组的和为max,起点和终点位置为s.e,正在扫描的子数组的和为add,起点和终点位置为i.j.max的初始值为-∞. 1.若数组的值全为负,则返回最大值. 2.逐个扫描数组元素,更新add.i.j的值. a.若add的值为正,则和max的值比较,如果大于max的值,更新max.s.e的值为add.i.j. b.若add的值为负,则从i到j这一段的数字只能减少子数组的和,要丢弃,add值清零并重下一个元素重新

求解最大连续子数组和问题

前言 最近工作不是特别忙,所以有更多时间来学习算法相关知识,补短处.题目来源于leetcode,通过一个算法题,我们去分析该算法题所属类型,以及解题思路,以及该算法题所用到的数学知识.选择的算法题目从容易到困难,逐步提高难度,解题的思路也是从简单到复杂,时间复杂度也是从低到高的顺序来书写这个系列的博客.因工作语言和使用熟练度原因算法采用Java编写,但该系列中可能会穿插c.C++.python语言实现,请不要奇怪. 题目 分析题目:给定的整型数组,求解最大连续子数组和,要求是至少包含一个元素,且