最大连续子数组

news2024/10/6 20:12:47

最大连续子数组(Maximum Subarray)问题是一个经典的算法问题,其目标是在给定的整数数组中找到一个连续的子数组,使得该子数组的元素之和最大。这个问题有多种解决方法,其中包括暴力解法、分治法和动态规划等。

下面是一个讲解最大连续子数组问题的常见解决方法:

  1. 暴力解法: 暴力解法是最简单的方法,它通过两层嵌套循环遍历所有可能的子数组,计算它们的和,并找到和最大的子数组。这个方法的时间复杂度是O(n^2),其中n是数组的长度。尽管它不是最高效的方法,但它是一个朴素而容易理解的解决方案。

  2. 动态规划: 动态规划是解决最大连续子数组问题的高效方法之一。在这种方法中,我们维护一个动态规划数组dp,其中dp[i]表示以第i个元素结尾的最大子数组和。动态规划的关键是通过递推关系来计算dp[i],这个关系通常是 dp[i] = max(dp[i-1] + nums[i], nums[i])。最终,最大子数组和就是dp数组中的最大值。这个方法的时间复杂度是O(n),其中n是数组的长度。

  3. 分治法: 分治法是另一种解决最大连续子数组问题的方法。它将数组分成三个部分:左子数组、右子数组和跨越中间的子数组。然后,递归地求解左子数组和右子数组的最大子数组和,以及跨越中间的最大子数组和。最后,将这三者中的最大值作为最终的结果。这个方法的时间复杂度是O(n*log(n)),其中n是数组的长度。

  4. Kadane算法: Kadane算法是一种高效的动态规划方法,用于解决最大连续子数组问题。它维护两个变量,cur表示当前子数组的和,maxv表示最大子数组和。在遍历数组的过程中,它不断更新curmaxv,并且当cur小于0时,将cur重置为0。最终,maxv就是最大子数组和。这个方法的时间复杂度是O(n),其中n是数组的长度。

我们来看看代码
 

int fun04(int* p, int left, int right);
void fun()
{
	int i=0, j=0, k=0;
	int len;
	int maxv;
	int v[] = { 1,-3,6,8,0,-7,8 };
	len = 7; maxv = v[0];
	for (int i = 0; i < len; i++)
	{
		for (j = i; j < len; j++)
		{
			if (j == i)
			{
				maxv = max(maxv, v[j]);
			}
			else {
				v[i] += v[j];
				maxv = max(maxv, v[i]);
			}
			
		}
	}
	cout << maxv << endl;
}
void fun01()
{
	int v[] = { 1,-3,6,8,0,-7,8 };
	int dp[7];
	dp[0] = v[0];
	int maxv = dp[0];
	for (int i = 1; i < 7; i++)
	{
		dp[i] = max(dp[i - 1] + v[i], v[i]);
		maxv = max(maxv, dp[i]);
	}
	cout << maxv << endl;
}

void fun02() {
	int v[] = { -2,-1 };
	int maxv = v[0];
	int cur = 0; 
	for (int i = 0; i < 2; i++) {
		cur += v[i];
		maxv = max(maxv, cur);
		if (cur >= 0) {
			maxv = max(maxv, cur);
		}
		else {
			cur = 0;
		}
	}
	cout << maxv << endl;
}

void fun03() {
	int v[] = { 1,-3,6,8,0,-7,8 };
	cout << fun04(v, 0, 6);
}
int fun04(int* p, int left, int right) {
	if (left == right) {
		return p[left];
	}
	int mid = (left + right) >> 1;
	int maxleft = fun04(p, left, mid);
	int maxright = fun04(p, mid + 1, right);

	int tmpleft = p[mid - 1];
	int tmp = tmpleft;
	for (int i = mid - 2; i >= 0; i--) {
		tmp += p[i];
		tmpleft = max(tmp, tmpleft);
	}

	int tmpright = p[mid + 1];
	tmp = tmpright;
	for (int i = mid + 2; i < right; i++)
	{
		tmp += p[i];
		tmpright = max(tmp, tmpright);
	}
	int midmax = p[mid] + (tmpleft > 0 ? tmpleft : 0) + (tmpright > 0 ? tmpright : 0);
	return max(maxleft, maxright > midmax ? maxright : midmax);
}

上面的代码演示了几种不同的方法来找到数组中的最大子数组和(最大子序列和问题),并进行了简要的分析。

  1. fun() 方法使用了嵌套的两个 for 循环来遍历所有可能的子数组和,同时维护最大值。这是一种朴素的暴力解法,时间复杂度为O(n^2),其中n是数组的长度。

  2. fun01() 方法使用了动态规划的思想,维护一个dp数组,其中dp[i]表示以第i个元素结尾的最大子数组和。在遍历数组的过程中,根据前一个元素的最大子数组和来计算当前元素的最大子数组和,从而避免了重复计算。这种方法的时间复杂度为O(n),其中n是数组的长度。

  3. fun02() 方法是一种更简单的方法,它遍历一次数组,同时维护当前子数组的和cur和最大子数组和maxv。当cur小于0时,表示当前子数组和不再对最大子数组和有贡献,需要将cur重置为0。这种方法也是O(n)时间复杂度。

  4. fun03() 方法是一个递归的分治方法,其中 fun04() 函数采用分治思想来寻找最大子数组和。它将数组分为左右两部分,然后分别计算左部分、右部分以及跨越中间的最大子数组和,然后取三者中的最大值作为最终的结果。这个方法的时间复杂度也是O(n*log(n)),因为它每次将数组分成两半,需要进行递归处理。

总的来说,动态规划方法(fun01()fun02())是解决最大子数组和问题的较优解,具有O(n)的时间复杂度,而分治方法(fun03())也是一个有效的算法,但在实际情况中可能不如动态规划方法高效。朴素的暴力解法(fun())具有O(n^2)的时间复杂度,不适用于大规模数据。选择合适的算法取决于实际问题和性能要求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1186707.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

转座子的鉴定

1.鉴定 将转座子鉴别和注释的方法分为3大类&#xff1a; ①从头算法&#xff1b; ②基于同源性的方法 &#xff1b; ③联合算法。 其中&#xff0c;从头算法又包括基于基因组序列比对的方法、K—mer方法和基于结构特征的方法 &#xff1b; 基于同源性的方法包括基于同源序…

Vue中的 配置项 setup

setup 是 Vue3 中的一个全新的配置项&#xff0c;值为一个函数。 setup 是所有 Composition API&#xff08;组合式API&#xff09;的入口&#xff0c;是 Vue3 语法的基础。 组件中所用到的数据、方法、计算属性等&#xff0c;都需要配置在 setup 中。 setup 会在 beforeCre…

说说对React中类组件和函数组件的理解?有什么区别?

一、类组件 类组件&#xff0c;顾名思义&#xff0c;也就是通过使用ES6类的编写形式去编写组件&#xff0c;该类必须继承React.Component 如果想要访问父组件传递过来的参数&#xff0c;可通过this.props的方式去访问 在组件中必须实现render方法&#xff0c;在return中返回…

Python实用技巧:将 Excel转为PDF

将Excel文件转换为PDF可以方便储存表格数据&#xff0c;此外在打印或共享文档时也能确保表格样式布局等在不同设备和操作系统上保持一致。今天给大家分享一个使用第三方Python库Spire.XLS for Python 实现Excel转PDF的简单方法。 实现步骤 首先&#xff0c;通过pip命令来安装依…

基于深度模型的日志异常检测

本文转载自&#xff1a;深度模型的日志异常检测&#xff0c;还有谁不会&#xff1f;PPT下载地址&#xff1a;https://bbs.huaweicloud.com/forum/thread-100052-1-1.html视频讲解地址&#xff1a;https://bbs.huaweicloud.com/live/DevRun_live/202101222000.html 文章目录 1. …

pyqt5的组合式部件制作(三)

到目前为止&#xff0c;组合式部件的制作已经初具雏形&#xff0c;唯一需要完善的是所有部件和子部件的自动初始化&#xff0c;如果有一个层次比较复杂的组合式部件&#xff0c;靠人工逐个输入子部件的名称显然不现实&#xff0c;比如下图&#xff1a; 这个部件由多层、多个部件…

类EMD的“信号分解方法”及MATLAB实现(第九篇)——小波包变换(WPT)/小波包分解(WPD)

在上一篇我们讲到了离散小波变换DWT&#xff0c;在建立了小波分解的基本概念后&#xff0c;我们现在转向小波包分解——一种更精细的小波分析方法。小波包分解在多分辨率分析的基础上&#xff0c;提供了一种全面的频率分析工具&#xff0c;这在许多复杂信号处理场合中被证明是极…

第五章:java方法重写/覆盖

系列文章目录 文章目录 系列文章目录前言一、方法重写/覆盖二、方法的重写和重载的比较总结 前言 方法重写指的是子类重写父类的方法。 一、方法重写/覆盖 方法覆盖(重写)就是子类有一个方法并且和父类的某个方法的名称、返回类型、参数一样&#xff0c;那么我们就说子类的这…

Docker指定容器使用内存

Docker指定容器使用内存 作者&#xff1a;铁乐与猫 如果是还没有生成的容器&#xff0c;你可以从指定镜像生成容器时特意加上 run -m 256m 或 --memory-swap512m来限制。 -m操作指定的是物理内存&#xff0c;还有虚拟交换分区默认也会生成同样的大小&#xff0c;而–memory-…

MySQL json相关函数详解

MySQL提供了一系列的JSON函数&#xff0c;用于解析、提取、修改和操作JSON数据。以下是一些常用的JSON函数及其功能。 以下所有操作都使用该表&#xff08;zone_test&#xff09;用来演示&#xff1a; 一&#xff1a;JSON_OBJECT(key1,value1,key2,value2) 1、作用&#xff1a;…

聚观早报 |GPT-4周活用户数达1亿;长城汽车10月销量增加

【聚观365】11月8日消息 GPT-4周活用户数达1亿 长城汽车10月销量增加 xAI宣布推出PromptIDE工具 aigo爱国者连发5款儿童手表 SpaceX预计今年营收90亿美元 GPT-4周活用户数达1亿 在OpenAI首届开发者大会上&#xff0c;该公司首席执行官萨姆奥特曼&#xff08;Sam Altman&a…

【Python】python获取本机IP的两种方式

1.使用专用网络 通过进入网站&#xff1a;http://myip.ipip.net获取本机ip地址 代码实现&#xff1a; import requests res requests.get(http://myip.ipip.net, timeout5).text print(res) 也可以在终端cmd中用如下代码实现; curl http://myip.ipip.net 2.使用自带的socke…

java8中的函数式接口的应用

函数式接口详解&#xff08;Java&#xff09;-CSDN博客 下面是一个去重的代码 /*** 学习Function匿名函数 和Predicate匿名函数 的定义* author Administrator**/ public class DistinctFilterList {public static final List<Dish> menu Arrays.asList( new Dish(&quo…

数据源、映射器的复用

开发环境&#xff1a; Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example参考代码目的&#xff1a;学习与总结 demo解决问题&#xff1a;复用球体数据源、映射器&#xff0c;vtkSmartPointer与std::vector、vtkNew与std::array的搭配使用…

实验5-2——网络yum源的配置

网络yum源的配置 实验步骤&#xff1a; 1.在/etc/yum.repos.d中新建一个文件夹bak备份原来的东西,查看/etc/yum.repos.d/内容 cd /etc/yum.repos.d mkdir bak ls 2.把/etc/yum.repos.d中已有的repo文件都移入bak文件夹中并查看 mv *.repo bak ls 3. 下载安装weget以防万一本…

程序员男盆友给自己做了一款增进感情的小程序

前言 又是无聊的一天&#xff0c;逛GitHub的时候发现一个给女朋友做了一个互动微信小程序&#xff0c;据说女朋友更爱自己了&#xff0c;所以当晚。。。。给自己做了丰盛的晚餐&#xff0c;我当即点开立马开发粘贴复制起来&#xff0c;想到做的小程序可以和未来的女朋友增进感…

带有滑动菜单指示器的纯 CSS 导航选项卡

效果展示 CSS 知识点 filter 属性回顾 transition 属性回顾 使用单选框实现导航菜单的思路 单选框当点击完成后就会有一个:checked属性&#xff0c;可以利用这个属性来实现导航菜单底部滑动块的滑动动画和当前菜单项激活状态的管理。 整体页面结构 <div class"tab…

C#创建Windows Service(Windows 服务)基础教程

Windows Service这一块并不复杂&#xff0c;但是注意事项太多了&#xff0c;网上资料也很凌乱&#xff0c;偶尔自己写也会丢三落四的。所以本文也就产生了&#xff0c;本文不会写复杂的东西&#xff0c;完全以基础应用的需求来写&#xff0c;所以不会对Windows Service写很深入…

springboot内容协商

1.基于请求头 Accept: application/json Accept: application/xml Accept: application/xxx 自定义数据 发的请求头的数据类型 期望返回的数据类型 2.通过请求参数 例如 /football?formatjson 一般respondbody 默认以json方式进行返回 如何请求同一个接口&#xff0c;可以…

四川芸鹰蓬飞:抖音短视频运营是做什么的?

抖音短视频作为一种新兴的社交媒体平台&#xff0c;它的运营团队肩负着将用户需求与平台资源相结合&#xff0c;促使平台发展壮大的重要任务。抖音短视频运营旨在通过精准的用户分析和有针对性的内容推送&#xff0c;提高用户留存和活跃度&#xff0c;增加广告收入&#xff0c;…