首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

算法导论之最大子段和

《算法导论》一书中对最大字段和可谓讲的是栩栩如生,楚楚动人。如果简单的说最大字段和,没有意义。而《算法导论》上举了一个股票的例子。...把问题做一个转换,求出相邻天数的股票价格的差值(周二 - 周一 = 差值),然后求出连续天数差值和的最大值,即为最大收益,所以就是最大子段和的问题。   ...还有一点说明的是算法的实现是和语言没有关系的,下面是用OC来实现的,你也可以用Java, PHP, C++等你拿手的语言进行实现,算法注重的还是思想。   ...原问题可以分为三种情况,求原数组中左半的最大字段和,求原数组中右半部最大字段和,求跨越中间位置部分的最大字段和,然后在三个最大字段和中去最大的字段和,即为原问题的解。即为分解,计算,合并的过程。...如果数组中又两个数那么就是两个数的和,运行结果如下: ?       下面是10个数据运行的结果,最大子数组肯定是包括array[mid]这一项的,因为我们求得就是过中点的最大字段和。 ?

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

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

    1 分治法 问题分析思路 将 数组 a[i...j]进行近二等分为2个子数组: a[i...mid] , a[mid+1 ... j]; 设最大子数组的下标为 left,right,那么left ,right...right 要么都在mid左边,要么都在mid右边,或者一个在左边,一个在右边; 那么接下来我们看一下,将数组完全二分后,求解思路: 先将数组进行二分 可以看到,分解后最小问题为单元素求解,最大子数组即为其自身...; image-b0db3ae1f48c4e5eac15e17fe6aa584d.png 到第二级时(此时数组只有2个元素),且已知左子数组的 最大子数组 和 右子数组的最大子数组,那么只剩下求解...以此类推,我们可以知道,实际上最后的问题都转化为了 跨 mid的结果 与 二分后的左右子数组的最大子数组的2个结果 三个之中作比较取最大值,而 左右子数组的最大子节点到最后又转化为了单节点,所以最终问题转化为了...这个加和一旦为负数,及抛弃前面所有的数据,重新开始计算求和,中间记录最大的和即为目标值,在赋值max时和sum清零时,即为 right索引和left索引更新的时机; package top.buukle.buukle

    21810

    Kadane算法,是如何求解最大子数组和的?

    Kadane's 算法是一种高效解决最大子数组和问题的动态规划算法。它通过迭代数组并维护两个变量来动态更新局部和全局的最大子数组和,最终返回全局最大值。...以下是算法的详细解释及步骤: 算法原理 在给定的整数数组中找到一个连续的子数组,使得子数组的和最大。该问题的关键在于数组中可能包含负数。...步骤 初始化: 令 maxEndingHere 表示以当前位置为结束的最大子数组和,初始值为数组的第一个元素。 令 maxSoFar 表示全局的最大子数组和,初始值也为数组的第一个元素。...算法图解 假设我们有如下数组: nums = [-2, 1, -3, 4, -1, 2, 1, -5, -2, 5] 我们将按照 Kadane's 算法来计算这个数组的最大子数组和。...算法题—翻转增益的最大子数组和 问题描述 小C面对一个由整数构成的数组,他考虑通过一次操作提升数组的潜力。这个操作允许他选择数组中的任一子数组并将其翻转,目的是在翻转后的数组中找到具有最大和的子数组。

    15720

    算法_最大子数组&合并排序数组

    最大子数组 难度:简单 描述: 给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。...return max.num; // 子数组的最大和 }; 觉得还不错的话,给我的点个star吧 合并排序数组 难度:简单 描述: 合并两个排序的整数数组 A 和 B 变成一个新的排序数组。...样例: 给出A=[1,2,3,4],B=[2,4,5,6],返回 [1,2,2,3,4,4,5,6] 题目分析: 注意 A 和 B 本来就是排序好的数组,最简单的就是用sort排序了。..., b) => { return a - b; // sort排序 }); }; 先对比完一个数组: 初始两个变量分别对应一个数组,进入循环 i 和 j 不会同时递增,只在对应数组元素打败另一数组元素时才会递增...,只要打败一个即可,因为两个数组一开始就是排序好的 i 和 j 必须有一个超过对应数组长度(这样至少有一个数组的元素被逐一比较过) 如果一个数组那边超过长度,会退出循环,但是可能由一方的长度还有剩余(比如一个元素打败另一数组的所有元素

    59310

    最大子数组和(LeetCode 53)

    因此,剩下的工作就是寻找跨越中点的最大子数组,然后在三种情况中选取和最大者。 如何找到跨越中点的最大子数组,很简单,我们只要以 mid 为起点,向左遍历找出左边最大子数组。...时间复杂度: 分治策略求解最大子数组使用了递归求解的方法,因此我们需要建立一个递归式来描述上面算法的时间复杂度。 在这里,对问题进行简化,假设原问题是规模的2的幂,这样所有子问题的规模均为整数。...此递归式与归并排序的递归式一样,求解递归式的时间复杂度可以采用《算法导论中》中文第三版的4.5节中提出的方法,可快速求解上面递归式的时间复杂度 T(n)=O(nlogn)。...,从数组左边开始,依次累加元素和,当小于 0 时,从下一个元素重新开始累加并与前面最大子数组的和比较,记录最大者。...最大子数组和 - LeetCode 算法导论中文版.原书第三版[M].P38-42

    13700

    最大子数组和

    1 题目描述 最大子数组和 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。...2 题目示例 示例 1: 输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。...这相当于是暴力解法中的不断调整最大子序和区间的起始位置。 那有同学问了,区间终止位置不用调整么?如何才能得到最大"连续和"呢? 区间的终止位置,其实就是如果count取到最大值了,及时记录下来了。...例如如下代码: if (count > result) result = count; 这样相当于是用result记录最大子序和区间和(变相的算是调整了终止位置)。...不少同学认为如果输入用例都是-1,或者都是负数,这个贪心算法跑出来的结果是0,这是又一次证明脑洞模拟不靠谱的经典案例,建议大家把代码运行一下试一试,就知道了,也会理解为什么result 要初始化为最小负数了

    38020

    动态规划套路:最大子数组和

    ,我首先想到的是滑动窗口算法,因为我们前文说过嘛,滑动窗口算法就是专门处理子串/子数组问题的,这里不就是子数组问题么?...但是,稍加分析就发现,这道题还不能用滑动窗口算法,因为数组中的数字可以是负数。...所以说我们这样定义dp数组是不正确的,无法得到合适的状态转移方程。对于这类子数组问题,我们就要重新定义dp数组的含义: 以nums[i]为结尾的「最大子数组和」为dp[i]。...既然要求「最大子数组和」,当然选择结果更大的那个啦: // 要么自成一派,要么和前面的子数组合并 dp[i] = Math.max(nums[i], nums[i] + dp[i - 1]); 综上,...今天这道「最大子数组和」就和「最长递增子序列」非常类似,dp数组的定义是「以nums[i]为结尾的最大子数组和/最长递增子序列为dp[i]」。

    72020

    07— 最大子数组和【LeetCode 53】

    最大子数组和 - 力扣(LeetCode) 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。...示例1: 输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。...由于题目中要求求出最大的连续的子数组,因此可以通过动态规划,来判断当前轮到的数,是否应该成为一个新的连续子数组的开头。...最后只需要从dp[]中找到最大的值,就是最大连续子数组的值。...耗时的原因是因为用了数组存储dp,然后又需要从dp数组中进行遍历找最大值,因此消耗了较多的时间。

    22520

    最大连续子序列和(最大子数组和)四种最详细的解法

    问题描述:给一个数组,有正有负,求其连续子序列的最大值 解法1:穷举暴力法 枚举左端点跟右端点,然后遍历更新所有的子序列和,最终得到结果就是最大的 #include using...,队首元素是整个序列的最小值,维护队列的同时,用前缀和的元素减去这个最小值,得到值最大,为这数组的子序列的最大值 #include using namespace std...= solve4(1,n); cout<<ans<<endl; system("pause"); return 0; } 4.动态规划 思路:这已经是可以用动态规划思想去考虑的最简单的问题了...我们开一个数组dp[] , 记录dp[i]表示以a[i]结尾的 全部子段中 最大的那个的 和。 这样我们就可以根据它dp[i] 的正负,去考虑是否把下一个元素加入到当前的子段。...最后我们只需要找出所有最大子段中,最大的那个。

    5.8K30

    算法学习之分治策略-最大子数组

    /*算法学习之分治策略-最大子数组*/ #include #include #include struct result_t { int...可以用树的后序遍历顺序表示递归顺序 要在自己的大脑中想象出一个很深的栈然后把函数的压栈顺序理清楚 i表示进栈 o表示出栈 按数组大小为10进行进出栈顺序为 f(0,9)i->f(0,4)i->f(0,2...以上模拟出了一个典型的二路递归的流程所以算法复杂度为此完全二叉树的深度lgn乘以叶子节点n=nlgn,暴力法的复杂度为n2,当数组长度超过10000后其速度将不能忍受 对于递归程序要有很好的抽象思维和整体把握的概念...right = find_max_arry(a,mid+1,end); //递归查找子数组右半边最大值 cross = find_mid_arry(a,start,mid,end); //合并查找数组中间最大值.../*以下是返回到上一层数组左半边或右半边的最大值*/ if(left.sum>=cross.sum&&left.sum>=right.sum) { return left; }

    23720

    dp算法 力扣152乘积最大子数组

    乘积最大子数组 - 力扣(LeetCode) 一、题目详情 给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。...子数组 是数组的连续子序列。 示例 1: 输入: nums = [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。...提示: 1 <= nums.length <= 2 * 104 -10 <= nums[i] <= 10 nums 的任何前缀或后缀的乘积都 保证 是一个 32-位 整数 二、算法讲解 题目求解的是乘积...针对nums[i] ,有大于0、小于0、等于0三种状态,故对于f表和g表的讨论也要带入nums[i]的不同状态,即:  故,可以使用虚拟空间,忽略对于 i - 1 边界的考虑,得到:  对于虚拟出来的...f表和g表的第一个格子空间,为了不干扰后续的结果,初始化为 f[0]=g[0]=1; 返回值则是f表中最大的那一个。

    16820

    最大子数组和

    nums中的最大连续子数组和,这里面有两个重要的信息:【信息1】连续子数组【信息2】最大的和既然是这样,那么我们以nums = [-2, 1, -3]为例,来看一下按照模拟拆分子数组的情况下,怎么能够计算出来最大连续子数组的和...】可以拆分出2个子数组,即:[-2, 1]和[1];那么在当前这两个子数组中,最大数组和就是1了;【以-3为结尾】可以拆分出3个子数组,即:[-2, 1, -3]、[1, -3]和[-3];那么在当前这三个子数组中...,最大数组和就是-2了;【结论】最终最大数组和就是1;为了便于大家理解,下图我画出了具体的操作过程,具体详情,请见下图所述:但是,对于上面的这种模拟分组计算来说,nums数组中元素较少时是没问题的,但是如果元素很多...那么有没有其他效率更高的算法呢?答案一定是有的。因为我们发现,本题需要求解出来的只是一个最大数组和,而并非要获取到最大数组和所对应的数组,所以我们可以采用动态规划的解题方式来解决这道题。...那么我们来分析一下,当要计算nums数组中第i个位置最大数组和的时候,其实我们只需要关注两个值:【值1】当前元素nums[i]【值2】以元素nums[i-1]为结尾的所有子数组中的最大数组和pre;【结论

    19420
    领券