首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

算法导论之最大子

算法导论》一书中对最大字段可谓讲的是栩栩如生,楚楚动人。如果简单的说最大字段,没有意义。而《算法导论》上举了一个股票的例子。...根据股票每天结束的价格来求出一时间内何时买入何时卖出能是收益最大。...把问题做一个转换,求出相邻天数的股票价格的差值(周二 - 周一 = 差值),然后求出连续天数差值的最大值,即为最大收益,所以就是最大子的问题。   ...还有一点说明的是算法的实现是语言没有关系的,下面是用OC来实现的,你也可以用Java, PHP, C++等你拿手的语言进行实现,算法注重的还是思想。   ...求此问题是通过分治法来做的,通过递归方式来进行分治

95270

【题解】最大子

题目描述 给出一个长度为 n 的序列 a,选出其中连续且非空的一使得这段最大。 输入格式 第一行是一个整数,表示序列的长度 n。...输入输出样例 输入 #1 7 2 -4 3 -1 2 -4 3 输出 #1 4 说明/提示 样例 1 解释 选取 [3,5] 子 {3,−1,2},其为 4。...仔细阅读题目,可发现题目要求的是连续且非空的最大子。 若用暴力方式处理复杂度为 图片 根据数据范围明显不可取。此时,可发现又是一个对连续区间的维护问题,那么我们尝试从其他的角度进行思考。...该区间元素必须连续,那么当碰见一个新的元素,无非出现两种情况: 该元素与之前的连续区间加起来的比较大 该元素与之前的连续区间加起来的还没有这个元素本身大 如果是情况1,那么连续区间总和就加上新增元素...前面的一组成新序列 */ int main(){ int n; int sum=0;//连续序列 int ans=-1e9;//最大连续序列 cin>>n;

23510

大子问题

如果该序列的所有元素都是负整数时定义其最大子为0。 例如(-2,11,-4,13,-5,2)的最大子为20,所求子区间为[2,4]。...问题分析: 直接的想法就是利用遍历法遍历所有的可能,然后找到最大的那个,显然这不是一种有效的方法,但切实可行。...在第二章的时候学习了分治方法,想到也可以把序列拆分成两部分,答案就在前半或者后半或者是穿过两中间的部分。 暴力遍历法: 就是找到所有可能的结果然后再判断找到符合要求的那一个。...首先我们需要一个循环来遍历从第一个位置到最后一个位置:for(int i = 0;i < n; i++),然后还需要一个内层循环来遍历从当前位置到最后一个位置,来分别计算当前的最大子: int maxSum...分治法: 针对最大字段这个具体问题本身的结构,还可以从算法设计的策略上对上述O(n²)计算时间算法加以更深刻的改进。

98750

对最大子的理解(动态规划)

问题 对一个长度为n的数组,找到连续的子,使它的和在所有子中是最大的。 比如3,4,-9,6。他们的最大子是7。...解法 A.遍历 O(n)=n^2 B.分治算法 O(N)=N*logN 数组分为Left与Right部分,最大字段要么在left,要么在right,要么必然包括mid-1与mid+1(这种情况复杂度仅为...左最大子5,右最大子15,经过3与-5的最大子15。三者选最大的15作为结果。 C.动态规划 将输入数组描述为a1到an的整数序列,令bj为a1到aj序列中包含aj的最大子。...由此可以推导,最大字段是b1到bn的集合中的最大值。 其实动态规划解法是分治解法的特殊情况,即right的长度为1.此时最大子,要么在左边,要么从mid+1开始向左找。...此时最大子仍然要么在左边,要么从mid+1向左找,但向左找的过程可以简化成常数时间(不直接找最大子,而是找b,仅仅找经过aj的最大子),也就是说不用考虑mid+1以外的项开头的

85030

蓝桥杯 最大子阵(前缀+最大子)--------C语言—菜鸟级

/* 给定一个n*m的矩阵A,求A中的一个非空子矩阵,使这个子矩阵中的元素最大。 其中,A的子矩阵指在A中行列均连续的一块。 样例说明 取最后一列,为10。...输入 输入的第一行包含两个整数n, m,分别表示矩阵A的行数列数。 接下来n行,每行m个整数,表示矩阵A。 输出 输出一行,包含一个整数,表示A中最大的子矩阵中的元素。...样例输入 3 3 -1 -4 3 3 4 -1 -5 -2 8 样例输出 10 提示 思路: 行的前缀(对行区间求和) + 最大子原理 (对列区间求和) */ #include #include int main() { long int xsum[502][502];//xsum[i][j]前 i 行 j列的前缀 long int i,...} for(i=1;i<=n;i++)//枚举 从 子阵行高 按 最大子 原理 求和 for(j=i;j<=n;j++) { ans=0; for(k=1;k<

39420

有趣的算法(十一) ——分治法:快速​求

有趣的算法(十一)——分治法:快速求值 (原创内容,转载请注明来源,谢谢) 一、需求 一个数组,里面有若干的数字,现需要得到这一组数字的最大值最小值。...二、简单分析 最基本的做法,是两两比对,可以区分出临时的最大值最小值,再拿临时的最大值最小值往后比较,有新的值则更新。总的需要的比较次数是2n-2。 三、优化 使用分治法快速求值。...即把数组分到最小的1-2个数,两两比较后,仅将最大值最小值回传,再两两比较值,回传新的值,最终得出最大值最小值。 分析需要比较的次数。当数组只有1个数时,T(1)=0;2个数时,T(2)=1。...当n不是2k,则次数会比3n/2-2略多,正好2的k次的数组长度时,这种算法较快。 四、实现 使用php编程,代码如下: <?...,数字个数为8,则预测的比较次数为3n/2-2=3*8/2-2=10,输出结果一致。

1.5K120

贪心算法:最大子

大子 题目地址:https://leetcode-cn.com/problems/maximum-subarray/ 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素...局部最优:当前“连续”为负数的时候立刻放弃,从下一个元素重新计算“连续”,因为负数加上下一个元素 “连续”只会越来越小。...全局最优:选取最大“连续” 「局部最优的情况下,并记录最大的“连续”,可以推出全局最优」。...「这相当于是暴力解法中的不断调整最大子区间的起始位置」。 「那有同学问了,区间终止位置不用调整么? 如何才能得到最大“连续”呢?」...例如如下代码: if (count > result) result = count; 「这样相当于是用result记录最大子区间(变相的算是调整了终止位置)」。 如动画所示: ?

77620
领券