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

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

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

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

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

大子数组 难度:简单 描述: 给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。...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排序了。...`sort`排序 把两个数组合并成一个数组 用 sort 升序进行排序。...,只要打败一个即可,因为两个数组一开始就是排序好的 i 和 j 必须有一个超过对应数组长度(这样至少有一个数组的元素被逐一比较过) 如果一个数组那边超过长度,会退出循环,但是可能由一方的长度还有剩余(比如一个元素打败另一数组的所有元素

58110

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

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

21920

算法初步 基本概念 最大子数组

案例 最大子数组求和 leetcode 53题 给定数组a[1…n],求最大子数组和,即找出1<=i<=j<=n,使a[i]+a[i+1]+…+a[j]最大。...msum = sum; } } return msum; } } 方法三:假设s[i] 为nums[0] 到nums[i]的和,那么要想求出最大子数组和...,就需要得到max(s[j] - s[i]),将s[j]固定,则需要求min(s[i]),所以此问题由最大子数组和转换成了求最小和(最小s[i])的问题,这次提交执行时间为10ms,超过了47.22%的人...if(si < minsi){ //min[0,6] = min(min[0,5] [6]) 求最小和可以通过增量来实现,si的(0,6)的最小和其实就是(0,5)的si最小和和si[6]比较...贪心算法的思路比较难以理解,后面介绍贪心算法的时候再回过头来看看。

39510

LintCode 最小子数组 && 最大子数组题目分析代码最大子数组

题目 给定一个整数数组,找到一个具有最小和的子数组。返回其最小和。...** 注意事项 子数组最少包含一个数字 ** 样例 给出数组[1, -1, -2, 1],返回 -3 分析 判断加与不加的情况,这道题的解法很巧妙,类似于背包问题。...每个数组的元素都有两种情况,加与不加,所以我们从第一个元素开始判断,包括第一个元素时,和不包括第一个元素的情况取最小值,进行判断选择。...min_so_far = Math.min(min_ending_here, min_so_far); } return min_so_far; } } 最大子数组...这道题的思路和最小子数组是一样的,只要更改判断小为判断大就可以了 这里就直接贴出代码 public class Solution { /** * @param nums: A list

42420

大子数组

大子数组差 给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大。 返回这个最大的差值。...Example: 给出数组 [1, 2, -3, 1], 返回 6 (|SUM([1,2]) - SUM([-3])|) 注意事项:子数组最少包含一个数 解题思路: 这题给人的第一感觉是可以用到最大子段和...我们需要将数组划分为不重叠的两部分,求出左边最大子段和 leftMax,以及右边最小子段和 rightMin,然后相减求最大差值;或者求出左边最小子段和 leftMin 以及右边最大子段和 rightMax...,然后相减求最大差值 同理,将原数组反转,按照相同的方法,从左到右,求出的是右边的最大子段和 rightMax = [8, 10, 6, 7, 5, 4, 6] ;从右到左,求出的是左边的最小子段和 leftMin...= [2, -1, -3, -2, -6, -4, 8],按照步骤 3 的方法,同时遍历求出的 rightMax 和 leftMin,即可找到右边最大子段和以及左边最小子段和,然后相减求最大差值 返回

1.2K40

大子数组问题

有了一个线性时间的FIND-MAX-CROSSING-SUBARRAY在手,我们可以设计求解 最大子数组问题的分治算法的伪代码了。...有时候,对某个问题,分治法能给出渐进最快的算法,而其他时候,我们不用分治法甚至做的更好。对于最大子数组问题,实际上还可以不用分治法,在线性时间内求解。...6.1算法思想 以下方法是一个非递归的,线性时间的算法算法思想描述如下: 对数组由左至右处理,记录已经处理的最大子数组。...在已知A[0,j]最大子数组的情况下,可以在线性时间内找出A[0,j+1]的最大子数组。 6.2动态规划法求解过程描述 以上算法思想时间是采用了动态规划的方法来设计求解算法。...不仅如此,在任意时刻,该算法都能对它已经读入的数据给出最大子数组(另外两种算法不具有这种特性)。具有这种特性的算法叫做联机算法

82220

大子数组

给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。...有正也有负,最大子数组肯定是正的。...以当前的这个数作为新的字数组的起点,如果发现是正的,当前的这个数加入子数组,以此类推,这样就能找到最大字数组了。...res_max; // write your code here } ---- 振哥指导了一个思路说是当两端相同的话,任意去掉一个是不明智的,后来我想了一下确实是这样的,因为如果恰好有一个就是最大子数组之列又恰好被去掉呢...,比如现在得到一个[2,-1,5,-3,2],最大字数组应该是[2,-1,5],但是我们这时候恰好把前面的2给去掉呢,这样得到的最大子数组只能是[5]了,这样显然是有问题的,嗯就是这样的。

70810

乘积最大子数组

题目: 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。...输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。...输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。...思路: 遍历数组时计算当前最大值,不断更新 我们需要记录阶段子数组最大值和最小值,当出现负数的时候我们阶段最大值×负数会变成阶段最小值,阶段最小值×负数会变阶段最大值,因此我们需要存储阶段最小值,并且在需要负数的时候进行提取的交换...//itemMax,itemMin存储当前子数组最大值和最小值 //其中需要itemMin存最小值主要因为数组里可能有负数,负数最小值再乘以一个整数就是最大值

64710

大子数组和(LeetCode 53)

假设寻找数组 A[low,high] 的最大子数组。使用分治意味着我们要将数组划分为两个规模尽量相等的子数组。也就是说,找到子数组的中间位置 mid,将数组分为两部分。...因此,剩下的工作就是寻找跨越中点的最大子数组,然后在三种情况中选取和最大者。 如何找到跨越中点的最大子数组,很简单,我们只要以 mid 为起点,向左遍历找出左边最大子数组。...然后以 mid+1为起点,向右遍历找出左边最大子数组。两个子数组拼接在一起,就是跨越中点的最大子数组。...时间复杂度: 分治策略求解最大子数组使用了递归求解的方法,因此我们需要建立一个递归式来描述上面算法的时间复杂度。 在这里,对问题进行简化,假设原问题是规模的2的幂,这样所有子问题的规模均为整数。...最大子数组和 - LeetCode 算法导论中文版.原书第三版[M].P38-42

7400

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

大子数组和 - 力扣(LeetCode) 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组数组中的一个连续部分。...由于题目中要求求出最大的连续的子数组,因此可以通过动态规划,来判断当前轮到的数,是否应该成为一个新的连续子数组的开头。...最后只需要从dp[]中找到最大的值,就是最大连续子数组的值。...耗时的原因是因为用了数组存储dp,然后又需要从dp数组中进行遍历找最大值,因此消耗了较多的时间。...然后就寻思用两个变量来替代数组,因为其实我发现有用的记录变量只有两个,一个是前面的连续的最大值,一个是结果,只需要定义这两个结果,然后不断更新这两个变量,完全可以将时间复杂度更大的数组存储的方式替换掉。

19420
领券