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

算法导论之最大子

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

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

算法练习(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

19410

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

大子数组 难度:简单 描述: 给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。...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 必须有一个超过对应数组长度(这样至少有一个数组的元素被逐一比较过) 如果一个数组那边超过长度,会退出循环,但是可能由一方的长度还有剩余(比如一个元素打败另一数组的所有元素

57610

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数组中进行遍历找最大值,因此消耗了较多的时间。

17320

大子数组

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 要初始化为最小负数了

33320

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

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

66620

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

问题描述:给一个数组,有正有负,求其连续子序列的最大值 解法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.2K30

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

/*算法学习之分治策略-最大子数组*/ #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; }

21120

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表中最大的那一个。

13720

大子数组

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;【结论

15320

大子数组

nums中的最大连续子数组,这里面有两个重要的信息: 【信息1】连续子数组 【信息2】最大的 既然是这样,那么我们以nums = [-2, 1, -3]为例,来看一下按照模拟拆分子数组的情况下,怎么能够计算出来最大连续子数组...1为结尾】可以拆分出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;

16711

大子数组(Java)

二、题目描述: 题目:        给你一个整数数组 ​​nums​​ ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。...具体请看如下示例: 示例 1: 输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的最大,为 6 。...而今天这题,我就分别带着你们从动态规划​​贪心算法​​的思路依次进行解题。        ...这样我们就能得出了动态规划的递推公式: f(i)=max{f(i−1)+nums[i],nums[i]};        而贪心的思想就是: 从左向右迭代,在迭代的过程中我们需要用maxSum来不断维持当前的最大子...2、贪心算法之leetcode提交运行结果截图如下: 复杂度分析: 时间复杂度:O(n),其中 n数组的长度。我们只需要遍历一遍数组即可 空间复杂度: 空间复杂度:O(1)。

19010

数据结构001:最大子数组

示例 1: 输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的最大,为 6 。...示例 2: 输入:nums = [1] 输出:1 示例 3: 输入:nums = [5,4,-1,7,8] 输出:23 解题思路 要求字数组中和最大的那组对应的,首先能想到的是完全遍历,使用暴力求解的方法...分析该问题,我们要找软柿子捏,首先分析1,以a结尾的子数组最大值为 f_{a-max}=a \tag1 对于2,以b结尾的子数组最大值为 f_{b-max}=max\{a+b, b\}\\=max...\{ f_{a-max}+b, b\} \tag2 对于3,以c结尾的子数组最大值为 f_{c-max}=max\{a+b+c, b+c, c\}\\ =max\{f_{b-max}+c, c\}...,我们设 f(i) 为以第 i 个元素结尾的连续子数组最大值,则有: f(i)=max\{ f(i-1)+nums[i],nums[i]\} \tag7 其中 0<i<n (n为数组元素的个数

37930

LeetCode - #53 最大子数组(Top 100)

微博:@故胤道长)的 Swift 算法题题解整理为文字版以方便大家学习与阅读。...LeetCode 算法到目前我们已经更新了 52 期,我们会保持更新时间进度(周一、周三、周五早上 9:00 发布),每期的内容不多,我们希望大家可以在上班路上阅读,长久积累会有很大提升。...描述 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组数组中的一个连续部分。 2....示例 示例 1 输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的最大,为 6 。...时间复杂度:O(n) 空间复杂度:O(1) 该算法题解的仓库:LeetCode-Swift[1] 点击前往 LeetCode[2] 练习 关于我们 Swift社区是由 Swift 爱好者共同维护的公益组织

41910
领券