分治策略之最大子数组问题

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

最大子数组,即子数组中的各个元素相加的和是所有子数组中最大的。


假设最大子数组为【ai.......aj】

则必然是以下三种情况:

(1)、完全位于子数组A【low.........mid】中

(2)、完全位于子数组A【mid+1.......high】中

(3)、跨越了中点low<=i<=mid<=j<=high


如果暴力求解的话,时间复杂度为:Θ(n²):

int find_max_subarray(int *arr, int len) {
    int max_sum = arr[0];
    for (int i = 0; i < len; i++) {
        int sum = 0;
        for (int j = i; j < len; j++) {
            sum += arr[j];
            if (sum > max_sum)
                max_sum = sum;
        }
    }
    return max_sum;
}


如果用分治法的话,将会简单很多,时间复杂度为:O(nlgn)

代码如下:

package lianxi;

public class max_ziarray {
public static int cross_subbary(int[] nums,int low,int mid,int high)
{
	int sum,sum1,sum2,left_sum,right_sum;
	sum1=0;
	sum2=0;
	left_sum=-9999;
	right_sum=-9999;
	for(int i=mid;i<=high;i++)
	{
		sum1+=nums[i];
		if(sum1>right_sum)
			right_sum=sum1;
	}
	for(int j=mid-1;j>=0;j--)
	{
		sum2+=nums[j];
		if(sum2>left_sum)
			left_sum=sum2;
	}
	sum=left_sum+right_sum;
	return sum;
}
public static int maxium_subbary(int[] nums,int low,int high)
{
	if(low==high)
		return nums[low];
	else
	{
		int mid=(low+high)/2;
		int left_sum=maxium_subbary(nums, low, mid);
		int right_sum=maxium_subbary(nums, mid+1, high);
		int maxum=cross_subbary(nums, low, mid, high);
		return Math.max(left_sum, Math.max(right_sum, maxum));
	}
}
public static void main(String[] args)
{
	int[] nums={13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};
	int low=0;
	int high=nums.length-1;
	int max;
	max=maxium_subbary(nums, low, high);
	System.out.println(max);
}
}

输出结果为:43

分治策略决“最大子数组问题        分治策略,大致可以理为,我们遇到一个规模比较大的问题,可以考虑将其划分为若干个规模较小的问题,然后规模较小的问题可以再继续分,知道问题变得显然容易决。听起来和递归有点相似,严格上讲,分治是一种思想,递归是对自身的调用,二者是不同层次的概念,但是他们都是在降低需要处理的规模。        最大子数组问题,给出一个数组,其中有实数若干,我们要找到一个子数组(连续的),使得该子数组... 阅读详情

相关推荐

分治策略最大子数组问题

问题描述: 给定一个数组A[low,...,high],含有负数(否则研究这一问题没有意义)。寻找A的和最大的非空连续子数组问题称为求最大子数组

winnerlyn的博客 2185

c语言实现分治算法求最大子数组

自己写的分治算法,也包括了暴力求的部分,并比较两者的运行时间,输出最大子数组的起始位置

C语言:最大子数组问题——分治策略

给出一个数组,要求计算出它的子数组和的最大值采用分治策略最大子数组有三种情况:一,在中间项的左侧;二,在中间项的右侧;三,跨越中间项。然后再此三种情况下找到最值;#include&lt;stdio.h&gt;int FindChileArray(int arr[],int low,int high);int FindChileArray_coenter(int arr[],int low,in...

u012953338的专栏 3399

分治策略最大子数组

分治策略就是把复杂的问题分成更小的问题来求,求过程中会涉及到以下三个步骤: 分:分步骤将问题划分为一些子问题,子问题的形式与原问题一样,只是规模更小,求更简单。 决:决步骤递归地求出子问题。如果子问题的规模足够小,则停止递归,直接求。 合并:合并步骤将子问题合成原问题。 求最大子数据过程中的思路是,先将数组分成两部分。那么根据最大子数组出现的位置就会有三种情况。 左侧...

石头会说话 的博客 536

分治策略(最大子数组)

问题 最大子数组问题   对于一个数组A,寻找A的和最大的非空连续子数组,称这样的连续子数组最大子数组(maximum subarray)。当然A中可能有负数,不然A的最大子数组就是A本身。   例如在以下数组中: 1 2 3 4 5 6 7 8 -16 -23 18 20 -7 12 -5 -22   最大子数组为下标3-6的子数组即[18 20 -7 12]其和为42。 题思路 1.穷举法   从左至右,找出所有以i(i=1 2…n)下标为初始下标的子数组需要O(n)时间复杂

qq_40166660的博客 999

【算法导论】分治策略最大子数组问题分析、伪代码及C代码实现

最大子数组问题分析 寻找A的和最大的非空连续子数组,我们称这样的连续子数组最大子数组。如下所示,A[1..16]的最大子数组为A[8..11],其和为43,是A的所有子数组中和最大的。 注意: 只有当数组中包含负数时,最大子数组问题才有意义。如果所有数组元素都是非负数,子数组问题没有任何难度,因为整个数组的和肯定最大。 使用分治策略的求方法 我们要寻找子数组A[low..high]的最大子数组。使用分治技术意味着我们要将子数组划分为两个规模尽量相等的子数组...

wgl307293845的博客 2545

分治法最大子数组问题

咱们在回忆下分治策略: 分(Divide)步骤:将问题划分为一些子问题,子问题的形式与原问题一样,只是规模更小 决(Conquer)步骤:递归地求出子问题。如果子问题的规模足够小,则停止递归,直接求 合并(Combine)步骤:将子问题组合成原问题 最大子数组问题: 有这么一个数组: [13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7] 数组中要包含负数, 要不没有意义. 全是正数的数组求和即可. 求出数组中连

m0_37759287的博客 1815

利用分治策略最大子数组问题

最大子数组问题是计算机科学中一个著名的问题,它要求在一个给定的整数数组中找到一个连续的子数组,使得子数组中的元素之和最大。这个问题不仅在理论上有其重要性,而且在实际应用中也相当广泛,如在图像处理、信号分析等领域,最大子数组问题法可以用来检测图像的边缘或分析信号的峰谷。在形式上,最大子数组问题可以被定义为寻找数组 A[1...n] 的一个子数组,使得子数组 A[i...j] 的元素之和最大。数学上,这可以表达为找到两个下标 i 和 j,使得从 i 到 j 的子数组之和是所有可能子数组最大的。

weixin_31597759的博客 1139

基于分治策略--求最大子数组问题

分治策略 回忆一下,在归并排序中,我们谈到了分治策略。那什么是分值策略? 在分治策略中,我们递归地求一个问题,在每层递归中应用如下三个步骤: 分(Divide) 步骤将问题分为一些子问题,子问题的形式与原问题一样,只是规模更小。 决(Conquer) 步骤递归地求出子问题。如果子问题的规模足够小,则停止递归,直接求。 合并(Combine) 步骤将子问题组合成原问题。 当子问...

weixin_43801718的博客 588

分治策略--最大子数组问题

分治策略中,我们递归地求一个问题,在每层递归中应用如下三个步骤: 分步骤将问题划分为一些子问题,子问题的形式与原问题一样,只是规模更少。 决步骤递归地求出子问题。如果子问题的规模足够小,则停止递归,直接求。 合并步骤将子问题组合成原问题最大子数组问题 问题描述:某家公司的股票价格是不稳定的,你可以在某个时刻买进一股该公司的股票,并在之后将其卖出,买进卖出都是在当天交易结束后进行。你知道股票的将来价格。你的目标是最大化收益。即“低价买进,高价卖出”。 股票价...

qq_38619449的博客 717

分治策略——最大子数组问题(附伪代码)

什么是最大子数组? 如图所示,为寻找数组A的和最大的非空连续子数组。我们称这样的连续子数组最大子数组(maximum subarray) 什么是分治策略? 1、分(Divide) 步骤将问题划分为一些小问题,子问题的形式与原问题一样,只是规模更小 2、决(Conquer) 步骤递归地求出子问题,如果子问题的规模足够小,则停止递归,直接求 3、合并(Combine) 步骤将子问题组合成原问题最大子数组使用分治策略 1、分 low表示数组最小下标,mid表示数组中间下标,high

fuzhijieabc的博客 1852

分治策略-股票获取最大收益-最大子数组问题

分治策略中,递归的求一个问题,在每层递归中有如下三个步骤: 分:将问题划分为一些子问题,子问题的形式与原问题一样,只是规模更小 决:递归地求出子问题,如果子问题的规模足够小,则停止递归,直接求 合并:将子问题组合成原问题 递归式 三种求递归式的方法: 代入法:猜测一个界,然后用数学归纳法证明这个界是正确的 递归树法:将递归式转换为一棵树,其结点表示不同层次的递归调用产生的代价。...

weixin_39795049的博客 2102

最大子数组问题】之分治策略分析

本例基于《算法导论》中的知识进行总结记录,针对【最大子数组问题】在分治策略方面的求,对应书籍第四章开篇。

Rebirth_F的博客 423

分治策略----最大子数组问题

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

陪你颠沛流离 476

分治策略最大子数组问题

分治策略中,我们递归求一个问题,在每一层递归应用中如下三个步骤:  分(Divide)步骤将问题划分为一些子问题,子问题的形式与原问题一样,只是规模更小。  决(Conquer)步骤递归地求出子问题。如果子问题的规模足够小,则停止递归,直接求。  合并(Combine)步骤将子问题组合成原问题。 一、最大子数组问题     寻找子数组A[low..high]的最大子数

编程小霸王的Blog 536

分治策略 | 最大子数组问题

分治策略,就是把一个大问题递归地分成规模较小的子问题,子问题的规模可能不等。最大子数组问题,找数组A中和最大的连续段A[i, .., j]。

不眠旅行 385

算法导论——分治策略——最大子数组问题

最大子数组:一个数组A的和最大的非空连续子数组。 注意:只有当数组中包含负数时,最大子数组问题才有意义。 暴力求法:(对每个子数组求和,选出和最大子数组分治策略方法: 将数组分成规模尽可能相等的子数组,即找到中间位置,然后考虑左子数组和右子数组最大子数组位置必然有以下三种情况: 完全位于左子数组中 2) 跨过了中点 3) 完全位于右子数组中 分别求出三种情况下的最大子数组,再选出三...

weixin_45115866的博客 619

最大子数组问题——分治策略

基本原理:最大字段有三种情况:1.最大字段在mid左边;2.最大字段在mid右边;3.最大字段经过mid第三种情况经过mid时,只需要从mid开始分别往左右两端遍历数组,找到最大值返回即可当最大字段在mid左边或者右边时,运用分治策略,把问题划分成更小的问题,递归决。 代码实现如下int FindMaxCrossingSubarray(int a[],int low,int mid,int hi...

ws7474741的博客 569
上一篇: windows server 2012R2 配置DNS服务器
下一篇: 动态规划之钢条切割问题
h4329201
博客等级 码龄12年 21粉丝 44原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值