首页
学习
活动
专区
工具
TVP
发布

算法练习(4) - 最大子数组

1 分治法 问题分析思路 将 数组 a[i...j]进行近二等分为2个子数组: a[i...mid] , a[mid+1 ... j]; 设最大子数组的下标为 left,right,那么left ,right...和 right 要么都在mid左边,要么都在mid右边,或者一个在左边,一个在右边; 那么接下来我们看一下,将数组完全二分后,求解思路: 先将数组进行二分 可以看到,分解后最小问题为单元素求解,最大子数组即为其自身...; image-b0db3ae1f48c4e5eac15e17fe6aa584d.png 到第二级时(此时数组只有2个元素),且已知左子数组的 最大子数组 和 右子数组的最大子数组,那么只剩下求解...我们可以再往上看一级 image-c4290db2231e4e059ec288ec555f57ac.png 以此类推,我们可以知道,实际上最后的问题都转化为了 跨 mid的结果 与 二分后的左右子数组的最大子数组的...2个结果 三个之中作比较取最大值,而 左右子数组的最大子节点到最后又转化为了单节点,所以最终问题转化为了 跨mid情况的求解; package top.buukle.buukle._03MaxSubarray

19210
您找到你想要的搜索结果了吗?
是的
没有找到

算法之路(一)----求最大子序列

优秀的算法甚至能给人amazing的感觉。 今天记录《数据结构与算法分析------C语言描述》中的一个求最大子序列的问题。...后面会给出实际的运行时间,还是先分析和记录算法吧。 算法1 算法1是穷举式的尝试所有的可能,用三重嵌套for循环来求解最大子序列,但是运行的时间非常慢,时间复杂度是O(NNN),即N的立方。...maxSum = subSum; } } } return maxSum; } 稍后一点经验的开发者,都可以看出内层的...该算法需要有一些分析: 在例子中,最大子序列和可能出现在三处。数据的左半部分,数据的右半部分,或者跨越数据的中部,左右两半部分各占一些。前两种情况可以用递归求解。...分析:该算法首先定义两个变量,maxSum用来记录当前求出的最大子序列和,subSum用来记录遍历的元素中非零和。

49830

算法导论之最大子段和

算法导论》一书中对最大字段和可谓讲的是栩栩如生,楚楚动人。如果简单的说最大字段和,没有意义。而《算法导论》上举了一个股票的例子。...把问题做一个转换,求出相邻天数的股票价格的差值(周二 - 周一 = 差值),然后求出连续天数差值和的最大值,即为最大收益,所以就是最大子段和的问题。   ...还有一点说明的是算法的实现是和语言没有关系的,下面是用OC来实现的,你也可以用Java, PHP, C++等你拿手的语言进行实现,算法注重的还是思想。   ...= %ld, subMaxSum = %ld", leftMaxStarIndex, rightMaxEndIndex, leftMaxSum + rightMaxSum); 53 //获取最大子数组...下面是10个数据运行的结果,最大子数组肯定是包括array[mid]这一项的,因为我们求得就是过中点的最大字段和。 ?

95170

贪心算法:最大子序和

大子序和 题目地址:https://leetcode-cn.com/problems/maximum-subarray/ 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素...「这相当于是暴力解法中的不断调整最大子序和区间的起始位置」。 「那有同学问了,区间终止位置不用调整么? 如何才能得到最大“连续和”呢?」...例如如下代码: if (count > result) result = count; 「这样相当于是用result记录最大子序和区间和(变相的算是调整了终止位置)」。 如动画所示: ?...nums.size(); i++) { count += nums[i]; if (count > result) { // 取区间累计的最大值(相当于不断确定最大子序终止位置...) result = count; } if (count <= 0) count = 0; // 相当于重置最大子序起始位置

77620

数列排序算法总结(Python实现)

参考链接: 用Python进行存储桶Bucket Sort排序 目录  十大排序算法(Python实现)  一. 算法介绍及相关概念解读  算法分类  相关概念  1....算法介绍及相关概念解读  算法分类  十种常见排序算法可以分为两大类:   非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。...操作只对相邻两个数比较与交换,每轮会将一个值交换到数据列首(尾),像冒泡一样。  每轮操作O(n)次,共O(n)轮,时间复杂度O(n^2)。 ...操作指选择,即未排序数逐个比较交换,争夺值位置,每轮将一个未排序位置上的数交换成已排序数,即每轮选一个值。  每轮操作O(n)次,共O(n)轮,时间复杂度O(n^2)。 ...:") for i in arr:     print(i,end=' ') 表现稳定的排序算法之一,因为无论什么数据进去都是O(n2)的时间复杂度,所以用到它的时候,数据规模越小越好。

47810

大子列和问题

今天来讨论一个很基础的算法问题,数列的最大子列和问题。这道题我是在看浙大陈姥姥的Mooc的时候看到的,算是陈越老师作为算法与数据结构开篇讲解的第一道算法实例题。...常用方法 首先,最大子列和这个问题有一个众所周知的办法,即为每次从数列的开头i,往结尾N累加,当加至结尾时,由i+1再次累加,直到N-N。...比较左半边的最大子列和,以及右半边的最大子列和,以及跨越边界的最大子列和。取出最大的那个数,即为整个数列的最大子列和。 这是一种很常用的算法思想,可以先看代码来理解一下。...* @param left 左半边的下标 * @param right 右半边的下标 * @return 所求数列的最大子列和 */ public static...在线处理 这个问题有个简单的算法,叫在线处理法,遍历数列的时候,顺便累加,每次累加的和若是小于0,那么我们可以认为最大子列和为负数时,一定不会让后面的部分增大了,所以就可以把它丢弃,重新置当前的sum

62540

算法复杂度分析与最大子串问题算法复杂度分析最大子序列问题

算法复杂度分析 算法复杂度基本定义 算法复杂度分析基于以下四条定义: 如果存在常数c与$n_{0}$使$N \geq n_{0} $时,有$T(N) \leq cf(N)$,则记 $T(N) = O(f...判断语句:时间估算为不超过所有分支运算时间之和(与选择耗时的一个分支相同) 循环语句:时间估算为循环次数的乘积(包括嵌套循环) 最大子序列问题 问题 已知一个序列,要求求和最大的连续子序列的和。...例如输入-2,11,-4,13,-5,-2,输出20(11-4+13) 求解 解法一:真.暴力求解 考虑简单直接的解法,计算出以某个数开头的所有子序列和,取出最大的值 func solution1(data...} } } return max_sum } // done: 1.115286s 解法三:分治法 分治法解决这个问题的方法是:找出左侧一半的最大子串...,找出右侧一半的最大子串,找出跨越左右分界的最大子串(左侧终点确定,右侧起点确定),比较得最大值。

78071

算法详解 - 神奇的兔子数列

算法知识点 递归、斐波那契数列 算法题目来源 异步社区 算法题目描述 假设第一个月有一对初生的兔子,第2个月进入成熟期,第三个月进行生育兔子,而一对成熟的 兔子每月会生1对兔子,兔子永不死去,那么从第一对初生的兔子开始..., 当月的兔子数量 = 上月兔子数 + 当月新生兔子 当月新生兔子 = 上上个月的兔子 因此,前面相邻两项之和,便构成了后一项,换言之 当月兔子数 = 上月兔子数 + 上上月兔子数 斐波那契数列如下...算法复杂度如何? 算法是否能改进?...另一种是求斐波那契数列的通项公式: 算法改进: 斐波那契数列中的每一项(开头的两项除外)是前两项之和,如果记录前两项的值,则只需要一次加法运算就可以得到当前项的值,时间复杂度会不会降低一些呢...算法复杂度大大降低。 还可以使用迭代法来取消空间复杂度。

67430

大子序列和问题之算法优化

在这个问题中,最大子序列和可能在三处出现:即左半部序列、右半部序列、穿过中部从而占据左右两半部分的序列。前两种情况可以通过递归求解。...故该序列的最大子序列和为max(6,4,0)= 6。 时间复杂度分析: 假设T(n)为求解大小为n的最大子序列和问题所花费的时间。...算法四: 算法三利用递归较好的解决了最大子序列和问题,但仔细分析,在递归过程中,同一个元素很可能多次被操作,有没有更高效的算法?先上代码!...不仅如此,在任意时刻,该算法都能对它已经读入的数据给出子序列问题的正确答案(其他算法即前三种不具有这个特性)。具有这种特性的算法叫做联机算法(online algorithm)。...仅需要常量空间并以线性时间运行的online algorithm几乎是完美的算法。 ————《数据结构与算法分析》(中文版第二版)

1.1K70

大子序列和问题之算法优化

在这个问题中,最大子序列和可能在三处出现:即左半部序列、右半部序列、穿过中部从而占据左右两半部分的序列。前两种情况可以通过递归求解。...故该序列的最大子序列和为max(6,4,0)= 6。 时间复杂度分析: 假设T(n)为求解大小为n的最大子序列和问题所花费的时间。...---- 算法四: 算法三利用递归较好的解决了最大子序列和问题,但仔细分析,在递归过程中,同一个元素很可能多次被操作,有没有更高效的算法?...不仅如此,在任意时刻,该算法都能对它已经读入的数据给出子序列问题的正确答案(其他算法即前三种不具有这个特性)。具有这种特性的算法叫做联机算法(online algorithm)。...仅需要常量空间并以线性时间运行的online algorithm几乎是完美的算法。————《数据结构与算法分析》(中文版第二版)

71630
领券