Java学习手册:(数据结构与算法-数组)如何求最大连续子数组之和?

java-求解连续数列 【求解连续数列】已知连续正整数数列{K}=K1,K2,K3…Ki的各个数相加之和为S,i=N (0<S<100000, 0<N<100000), 求此数列K。 输⼊描述: 输⼊包含两个参数,1)连续正整数数列和S,2)数列⾥数的个数N。 输出描述: 如果有解输出数列K,如果⽆解输出-1 示例1: 输⼊ 525 6 输出: 85 86 87 88 89 90 import java.io.IOException; import java.util.*; /** * 阅读详情
问题描述

一个有n个元素的数组,这n个元素可以是正数也可以是负数,数组中连续的一个或多个元素可以组成一个连续的子数组,一个数组可能有多个这样的连续子数组,求子数组和的最大值。

示例:

对于数组{1,-2,4,8,-4,7,-1,-5}而言,其最大和的子数组为{4,8,-4,7},最大值为15。

方法一:

暴力法。找出所有子数组,然后求出子数组之和,在所有子数组和中取最大值。
时间复杂度:O(n^3)

方法一代码:
package com.haobi;
/*
 * 如何求最大子数组之和?
 */
public class Test8 {
	public static void main(String[] args) {
		int[] arr = {1,-2,4,8,-4,7,-1,-5};
		System.out.println(maxSubArray1(arr));
	}
	
	public static int maxSubArray1(int[] arr) {
		int n = arr.length;
		int Max = Integer.MIN_VALUE;
		int Sum = 0;
		for(int i=0;i<n;i++) {
			for(int j=i;j<n;j++) {
				//为Sum赋初值
				Sum = 0;
				//框定区间
				for(int k=i;k<j;k++) {
					//求总和
					Sum += arr[k];
				}
				//每个子数组的和与之前的和的最大值比较
				if(Sum > Max) {
					Max = Sum;
				}
			}
		}
		return Max;
	}
}
方法二:

重复利用已经计算出来的子数组和。例如Sum[i,j]=Sum[i,j-1]+arr[j]。
时间复杂度:O(n^2)

方法二代码:
package com.haobi;
/*
 * 如何求最大子数组之和?
 */
public class Test9 {
	public static void main(String[] args) {
		int[] arr = {1,-2,4,8,-4,7,-1,-5};
		System.out.println(maxSubArray2(arr));
	}
	
	public static int maxSubArray2(int[] arr) {
		int n = arr.length;
		int Max = Integer.MIN_VALUE;
		for(int i=0;i<n;i++) {
			//为Sum赋初值
			int Sum = 0;
			for(int j=i;j<n;j++) {
				Sum+= arr[j];
				if(Sum > Max) {
					Max = Sum;
				}
			}
		}
		return Max;
	}
}
方法三:

通过动态。判断数组的最后一个元素arr[n-1]与最大子数组的关系分为以下3种情况:
(1)最大子数组包含arr[n-1],即以arr[n-1]结尾。
(2)arr[n-1]单独构成最大子数组。
(3)最大子数组不包含arr[n-1],那么问题转换为求arr[0,…,n-2]的最大子数组。
因此,假设All[i-1]表示从arr[0]到arr[i-1]中最大的一段数组之和,End[i-1]表示从arr[0]到arr[i-1]中包含arr[i-1]的最大的一算数组之和,可得到动态方程:All[i-1] = max{arr[i-1],End[i-1],All[i-2]}
时间复杂度:O(n)

方法三代码:
package com.haobi;
/*
 * 如何求最大子数组之和?
 */
public class Test10 {
	public static void main(String[] args) {
		int[] arr = {1,-2,4,8,-4,7,-1,-5};
		System.out.println(maxSubArray3(arr));
	}
	
	public static int maxSubArray3(int[] arr) {
		int n = arr.length;
		int[] End = new int[n];
		int[] All = new int[n];
		End[n-1] = arr[n-1];
		All[n-1] = arr[n-1];
		//为防止数组越界,提前给数组中第一个元素赋值
		End[0] = All[0] = arr[0];
		for(int i=1;i<n;i++) {
			//求arr[i]、以arr[i]结尾的子数组 两者中的最大值
			End[i] = max(End[i-1]+arr[i], arr[i]);
			//状态方程
			All[i] = max(End[i],All[i-1]);
		}
		return All[n-1];
	}
	
	public static int max(int m, int n) {
		return m>n ? m:n;
	}
}
方法四:

优化动态规划。可以定义两个变量保存End[i-1]与All[i-1]的值,并且可以反复利用,这样可以降低空间复杂度。
时间复杂度:O(n)

方法四代码:
package com.haobi;
/*
 * 如何求最大子数组之和?
 */
public class Test11 {
	public static void main(String[] args) {
		int[] arr = {1,-2,4,8,-4,7,-1,-5};
		System.out.println(maxSubArray3(arr));
	}
	
	public static int maxSubArray3(int[] arr) {
		int n = arr.length;
		//有n个数字数组的最大子数组和
		int All = arr[0];
		//有n个数字数组包含最后一个元素的子数组的最大和
		int End = arr[0];
		for(int i=1;i<n;i++) {
			//求arr[i]、以arr[i]结尾的子数组 两者中的最大值
			End = max(End+arr[i], arr[i]);
			//状态方程
			All = max(End, All);
		}
		return All;
	}
	
	public static int max(int m, int n) {
		return m>n ? m:n;
	}
}
Java实现最大连续子数组和 1 问题描述 给定一个整数数组,数组里可能有正数、负数和零。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。例如,如果输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},那么输出为该子数组的和18。 2 解决方案 2.1 蛮力枚举法 package com.liuzhen.array_2; public c... 阅读详情

相关推荐

JAVA算法:求连续子数组的最大和(详细讲解)

JAVA算法:求连续子数组的最大和(详细讲解) 给定一个一维整型数组,请这个数组中连续子数组的最大和。 这个题目很常见,可以参考我的另外两篇博文 https://blog.youkuaiyun.com/seagal890/article/details/88616329 https://blog.youkuaiyun.com/seagal890/article/details/89062176 这里说明一下K...

梅森上校的博客 业精于勤荒于嬉,形成于思毁于随。 3649

【Java版oj】day05连续子序列

dp[i] 就是以数组下标为 i 的数做为结尾的最大子序列和,注意是以 i 为结尾,比如说现在有一个数组{6,-3,-2,7,-15,1,2,2},dp[2]就是以-2为结尾的,那么显然dp[3]的最大值就是1咯(6,-3,-2),dp[3]要以7结尾那么以7结尾的子序列最大和就是8(6,-3,-2,7)。第一行一个整数n(1

m0_63372226的博客 233

动态规划——求最大子数组和

1、问题:有一个整数数组arr,请找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。 2、解题思路:(实例解说) 例如: arr[100]={5,7,-15,2,-3,6} 最大子数组和为:12 核心思路: 以每一个数字做为子数组的结尾数字,向前做加法,如果前面的子数组和大于0,则继续加上,如果前面的子数组的和小于0,则此时子数组和为自身。这话说得有点不清楚,我们直接看实例就明白了。 过程分析: ...

m0_57526824的博客 2964

求解最大连续子序列和问题(Java)蛮力法+分治法

求解最大连续子序列和问题 【问题描述】 给定一个有n(n>=1)个整数的序列,要求求出其中最大连续子序列的和 【样例输入】 6 -2 11 -4 13 -5 -2 【样例输出】 20 【问题求解】 对于含有N个整数的序列a[0…n-1],若n=1,表示该序列仅含一个元素,如果该元素大于0,则返回该元素;否则返回0。 ● 暴力枚举法:用两层循环枚举起点和终点,尝试所有的子序列,然后计算每个子序...

MJ980629的博客 3766

c/c++ 算法之求连续子数组的最大和

一个整型数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和,求所有子数组的和的最大值,例如输入的数组为1,-2,3,10,-4,7,2,-5,那么最大的子数组为3,10,-4,7,2,因此输出为该子数组的和18 int MaxSum(int* a,int n) { int MaxSum=a[0]; int TempSum=0; f

hjkhjk007的专栏 2059

labview的TDMS文件读写

本文先介绍TDMS概念和文件结构,然后介绍VI如何使用,最后分析一个labview的自带范例

观则明的博客 1万+

力扣--523.连续的子数组和

题目描述 给定一个包含非负数的数组和一个目标整数 k,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,总和为 k 的倍数,即总和为 n*k,其中 n 也是一个整数。 示例 1: 输入: [23,2,4,6,7], k = 6 输出: True 解释: [2,4] 是一个大小为 2 的子数组,并且和为 6。 示例 2: 输入: [23,2,6,4,7], k = 6 输出: True 解释: [23,2,6,4,7]是大小为 5 的子数组,并且和为 42。 官方解答 方法1:暴力 [Time

weixin_45888851的博客 417

哈工大集合论与图论(下)慕课MOOC答案

答案选自2023哈工大集合论与图论慕课,慕课的题重复率很高并且具有极高的相似性,选答案时要格外注意对比选项,能力有限答案不一定面面俱到,整理不易读者且用且珍惜。

qq_34168477的博客 2902

一个数组有 N 个元素,求连续子数组的最大和(动态规划问题)

该题题目如上,例如【-1,2,1】连续的最大子数组为【2,1】,和为3; 题目要求我们输入第一个数为数组元素的个数,然后后面为我们需要输入的元素。 遇到这一个题,我们首先可以这样考虑,设置一个sum和result,sum是用来每次加新的元素,result是最后得出最大的子数组和。 我们可以每次给sum中添加新的元素,从第一个开始向后,如果遇到和比result大的时候,就把sum的值赋给res...

hgxy123的博客 3334

抖音直播参数逆向实战:手把手教你用Python获取ttwid和x-bogus(附完整代码)

本文深入解析抖音直播接口的反爬机制,重点剖析核心防护参数ttwid和x-bogus的生成原理与作用。通过Python实战,手把手教你逆向获取ttwid、webid等关键参数,并构建稳定的数据采集方案,为开发者提供企业级数据获取能力。

weixin_29196891的博客 1044

高通camx架构学习(零)—— 深入理解Camera 硬件抽象层

从上面的定义可以看出,主要是通过hw_module_t 代表了模块,通过其open方法用来打开一个设备,而该设备是用hw_device_t来表示,其中除了用来关闭设备的close方法外,并无其它方法,由此可见谷歌定义的HAL接口,并不能满足绝大部分HAL模块的需要,所以谷歌想出了一个比较好的解决方式,那便是将这两个基本结构嵌入到更大的结构体内部,同时在更大的结构内部定义了各自模块特有的方法,用于实现模块的功能,这样,一来对上保持了HAL的统一规范,二来也扩展了模块的功能。

图像学习之旅 1668

数据结构与算法 - 子数组最大和(Kadane算法):DP的简化实现

文章摘要 本文介绍了Kadane算法求解子数组最大和问题。该算法以动态规划思想为基础,通过维护当前子数组和(currentSum)和全局最大值(maxSum)实现O(n)时间复杂度和O(1)空间复杂度的最优解。文章详细解析了算法原理,包括状态转移方程、Java实现代码和可视化执行过程,并拓展了记录子数组位置的变种问题。通过数学归纳和贪心策略的双重视角,作者论证了算法的正确性,使读者能够深入理解这一经典算法的核心思想与实用价值。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

使用Hyper-V使用下载下来的macOS安装引导安装macos

然后关闭工具返回安装界面选择第二个reinstall,选择119g那个硬盘。我的资源上传了:macOS Monterey on Hyper-V.7z。设置固件的启动顺序,引导安装盘放到第一位,mac安装110g放第二。选择disk utility格式化那个110g。下载解压的macos引导挂载到虚拟硬盘。其他设置安全禁用,检查禁用,集成都选中。新建一个虚拟硬盘装mac,110g。

viviliving的专栏 3023

连续子数组的最大和

题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序...

forever-and-ever的博客 2万+

CAD制图

CAD制图可以提高设计效率和准确性,并方便文档的存档和交流,是现代工程设计中不可或缺的一部分。·CAD三维开发是指使用计算机程序和工具来创建、编辑和操作三维模型、图形和设计的过程。它在工程、建筑、制造和游戏等领域广泛应用。CAD三维开发可能涉及到复杂的图形算法、性能优化、并行计算等方面的内容,因此需要深入学习和实践,以提高开发的效率和质量。

RZer的博客 1651

ISP工程师实战笔记:5种Demosaic算法优缺点对比(含Hamilton/DFPD代码片段)

本文从ISP工程师实战角度,深入对比了五种经典Demosaic算法的优缺点。文章详细剖析了双线性插值、Hamilton、DFPD、DLMMSE和GBTF等算法的核心思想、实现差异与性能表现,并提供了Hamilton和DFPD算法的关键代码片段。重点探讨了在图像信号处理流水线中,如何根据画质、计算复杂度和功耗等工程约束进行算法选型与权衡。

weixin_42527589的博客 248

算法的学习笔记—连续子数组的最大和

本文介绍了求解连续子数组最大和的经典算法问题。通过动态规划思想,维护当前子数组和与最大值,当累积和为负时舍弃重新计算。算法时间复杂度O(n),空间复杂度O(1)。文章详细解释了核心思路、Java实现步骤,并通过示例演示计算过程,还讨论了全负数数组、获取子数组位置等扩展场景。该算法在金融分析、信号处理等领域有广泛应用,是动态规划的典型实例。

业精于勤,荒于嬉 4118

STM32实现简单的智能电子相框

具体的代码案例和详细的代码实现超过5000字,无法在此篇文章中提供。但是,你可以参考STM32的官方文档和相应的图形库和多媒体库的文档,以获得更详细的实现细节和代码示例。对于硬件,我们可以选择使用STM32开发板,如STM32F4 Discovery。对于软件开发环境,我们将使用Keil MDK-ARM作为开发工具,并使用STM32CubeMX进行代码配置。在本文中,我们将使用STM32单片机实现一个简单的智能电子相框,包括显示照片、播放视频和音乐功能。接下来,我们将详细描述实现智能电子相框的步骤。

2401_85625565的博客 1005

【Java】如何求最大子数组之和

问题描述 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;一个有n个元素的数组,这n个元素可以是正数也可以是负数,数组中连续的一个或多个元素可以组成一个连续的子数组,一个数组可能有多个这种连续的子数组,求子数组和的最大值。 输入示例 输入数组{1,-2,4,8,-4,7,-1,-5} 输出示例 最大值:15 其最大和的子数组为{4,8,-4,7}

wilson_m的博客 4567

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

最大连续子数组和(一个数组有 N 个元素,求连续子数组的最大和)

最大连续子数组和 一个数组有 N 个元素,求连续子数组的最大和。 例如:[-1,2,1],和最大的连续子数组为[2,1],其和为 3 输入描述: 输入为两行。 第一行一个整数n(1 <= n <= 100000),表示一共有n个元素 第二行为n个数,即每个元素,每个整数都在32位int范围内。以空格分隔。 输出描述: 所有连续子数组中和最大的值。 示例: 示...

qq_43109561的博客 3348

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

算法016:连续子数组的最大和-输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

题目: 连续子数组的最大和 输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为O(n)。 示例1: 输入: nums = [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释:连续子数组[4,-1,2,1] 的和最大,为6。 提示: 1 <=arr.length <= 10^5 -100 <= arr[i] <= 100 思路: 使用动态规划 dp[i] 标识以i结尾的数组和最大的值。 1

前路无畏的博客 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

java求连续子数组的和最大

题目描述: 输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)。 思路: 我们可以使用分治法或者减治法来处理这个问题。 分治法     目标:把1个大问题分成2个小问题,2个小问题还可以再分,直到问题规模小的可以简单解决。 将该数组等分成两个子数组,假如知

li_zhenxing的专栏 3229

【连续】子数组之和最大并得到子数组的下标边界

此博客的目的仅供个人学习和分享,其实也是为了自己复习知识方便,这也是本人第一次写博客,缺乏经验,见谅见谅!该文章主要是为了求【连续】子数组之和最大并得到子数组的下标边界,使用的算法采用的是分治的思想,分治算法的思想是将一个比较复杂的问题,分解为K个规模比较小的问题,如果这些子问题还较大,难以解决,可以再把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止。这就是分治策略的基本思,想这些子问

孙十万与张八百的专栏 1285

求数组中连续子数组的最大和

LeetCode的一道算法题: 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 分析: 我们可以假设数组的第一个元素认为是最大和maxSum,定义数组求和变量int sum = 0,则可以依次向后累加数组中其他元素sum += nums[i],如果sum < 0,则将sum = nums[i],因为sum &l

薄红的博客 2594

数据结构与算法之最大子数组和问题

数据结构与算法之最大子数组和问题

weixin_47225948的博客 1515
上一篇: Java学习手册:(数据结构与算法-数组)如何把一个数组循环右移k位?
下一篇: Java学习手册:(数据结构与算法-数组)如何找出数组中第k个最小的数?
浩比浩比
博客等级 码龄12年 395粉丝 202原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值