算法实践篇-求最大子数组

【算法导论学习】分治法求最大子数组 最大子数组分治法问题分析方向对时间复杂度的分析样例分析问题分析分解问题解决问题合并问题对代码的设想中间部分的处理递归部分完整代码 分治法 所谓分治法,就是把问题不断分割变小,常见的是把数组分割为两部分,然后分别计算,将大问题变成小问题。 问题分析方向 这一类问题主要用的是递归的方法,所以时间复杂度普遍为O(nlogn) 对时间复杂度的分析 样例分析 接下来分析最大子数组问题 问题分析 分解问题... 阅读详情
package com.sort.divid;

/**
 * 求最大子数组
 * @author Administrator
 *nlogn
 */
public class MaxSubArray {
	private static int[] findMaxCrossSubArray(int [] data,int left,int middle,int right){
		int [] result=new int[3];
		int leftmax=data[middle];
		int sum=leftmax;
		int leftIndex=middle;
		for(int i=middle-1;i>=left;i--){
			sum=sum+data[i];
			if(sum>leftmax){
				leftmax=sum;
				leftIndex=i;
			}
		}
		int rightmax=data[middle+1];
		sum=rightmax;
		int rightIndex=middle+1;
		for(int i=middle+2;i<=right;i++){
			sum=sum+data[i];
			if(sum>rightmax){
				rightmax=sum;
				rightIndex=i;
			}
		}
		result[0]=leftmax+rightmax;
		result[1]=leftIndex;
		result[2]=rightIndex; 
		return result;
	}
	
	private static int[] findMaxSubArray(int []data,int left,int right){
		int [] result=new int[3];
		if(left==right){
			result[0]=data[left];
			result[1]=left;
			result[2]=right;
			return result;
		}
		int middle=(left+right)/2;
		int[] leftResult=findMaxSubArray(data,left,middle);
		int [] rightResult=findMaxSubArray(data,middle+1,right);
		int []crossResult=findMaxCrossSubArray(data,left,middle,right);
		if(leftResult[0]>rightResult[0]&&leftResult[0]>crossResult[0]){
			return leftResult;
		}else if(rightResult[0]>leftResult[0]&&rightResult[0]>crossResult[0]){
			return rightResult;
		}else{
			return crossResult;
		}
	}

	public static void main(String[] args) {
		int[] data=new int[]{-1,2,9,11,-20,9,6,22,-8,9,1};
		for(int i=0;i<data.length;i++){
			System.out.print(data[i]+" ");
		}
		System.out.println();
		int []result=findMaxSubArray(data,0,data.length-1);;
		for(int i=0;i<result.length;i++){
			System.out.print(result[i]+" ");
		}
		System.out.println();

	}

}

【算法拾遗】三种方法求连续子数组的最大和 这是一道考的烂的不能再烂的题目,但是依然有很多公司乐于将这样的题目作为笔试或面试题,足见其经典。 问题是这样的:一个整数数组中的元素有正有负,在该数组中找出一个连续子数组,要求该子数组中各元素的和最大,这个子数组便被称作最大子数组。比如数组{2,4,-7,5,2,-1,2,-4,3}的最大子数组为{5,2,-1,2},最大子数组的和为5+2-1+2=8。 下面按照时间复杂度逐步优化的顺序依次给出这三种算法。 阅读详情

相关推荐

算法导论——分治算法求最大子数组

算法导论——分治算法求最大子数组 问题描述:求一个数组中的连续子数组,该连续子数组的和的值最大。 解决方法: 最为直观的方法就是暴力破解了吧,也就是直接求出该数组的每一个子数组,进一步求和,选取其中最大值。但是暴力法的时间复杂度比较高,为O(n^2),这里不贴代码了,因为是刚好学到了分治算法。 分治算法求解:具体思路如下 1.求一个数组中的最大子数组,利用分治算法,首先第一步需要做的就是将该数...

qq_3302860184的博客 745

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

问题描述: 分析: 先做处理,简单处理成每一天股票变化的净值。 故问题简化为在数组 {13 -3 -25 20 -3 -16 -23 18 20 -7 12 -5 -22 15 -4 7} 中找出子数组中,元素加和最大的问题。 简单思路:暴力法来求解问题,简单的对每种买进和卖出进行日期组合,共有Cn2种组合,故其时间复杂度为O(n^2)。 分治策略: 我们来思考如何用分治技术来求解最大子数组问题。假定我们要寻找子数组A[ low. . high]的最大子数组。使用分治技术意味着我们要将子数组划分为两个规

weixin_44890986的博客 624

求最大子数组的和,以及求该最大子数组的起始位置和末尾位置

问题描述: 一个数组,长度为N,数组元素有负有正,如{-1, 4, 6, -3, 7, -3, -3, 9};我们可以清楚的知道最大的子数组应该是4到9,也就是下标1到下标7,和为17。 求解思路: 第一种方法:我们可以用定义1、两个数ThisSum和MaxSum来记录当前数组的和,以及数组的最大和。 2、我们可以用两个for循环来来遍历数组,每一次求出子数组的最大和,每个子数组从

大风的专栏 2803

求最大子数组的三种方法

(1)暴力求解,运行时间是n²        int ans = -1000000;          for(int i=0; i&lt;n; i++)          {              int sum = 0;              for(int j=i; j&lt;n; j++)              {                  sum += nums[j]...

wangsiman的专栏 1万+

给定一个数组,求数组的最大连续子数组,使得该子数组的和最大

最大连续子数组 给定一个数组,求数组的最大连续子数组,使得该子数组的和最大 解释 因为昨天的算法题还有别方法没写,直接复制昨天的内容,在此基础进行跟进 暴力法 直接先上代码 function maxSubarray(arr) { let maxSum = arr[0] let startIndex = 0 let endIndex = 0 for (let i ...

weixin_45695922的博客 1173

分治法求最大子数组问题

分治法求最大子数组问题 1、最大子数组问题: 在长度为n的一维数组中,求一个元素相加后和最大的连续子数组。 2、暴力求解 求得这样的连续数组,暴力求解就是从第一个元素开始,分别计算1个,2个,3个……直到n个元素的和并进行比较,再从第2个元素开始,计算n-1个数组的和……最后计算第n个元素开始的数组,也就只有它本身一个元素的数组,这样计算下来算法的复杂度在n...

sh805499910的博客 1929

分治法求最大子数组

求最大子数组: 一给定好的数组,在不改变起排列顺序的情况下,求非空的求和最大的子数组。 思路:把原数组分成两半,分别求两半的最大子数组,再求这两半合并后从中间往两边的最大子数组。然后把这三部分比较,得到整个的最大子数组。 例子:先分,如图 再治: 上代码: #include<iostream> using namespace std; #include<limits.h> int max(int a, int b, int c) { return a > (b >

drdtddtrdr的博客 1702

GBT 27930-2015/2023国标充电协议A类CAN报文ID说明

国标充电CAN的ID,仅供学习参考。

qqq080的博客 7820

Kadane 算法详解:求最大连续子数组和

设。

六六哥的博客 1294

长短期记忆网络(LSTM)预测模型及其Python和MATLAB实现

LSTM 通过独特的门控机制解决了传统 RNN 的梯度消失和梯度爆炸问题,使其在处理长序列时具有显著优势。随着技术的不断发展,LSTM 及其变种(如 Bi-directional LSTM、Stacked LSTM 等)有望在更复杂的任务中发挥重要作用。2. **可视化真实值和预测值**:通过绘图来比较真实值和预测值,判断模型的准确性。2. **输入门(Input gate)**:决定当前的输入信息对细胞状态的影响。1. **细胞状态(Cell state)**:保持信息在时间步之间的传递。

qq_45441438的博客 2056

结构力学程序算法理论基础(一)————虚功原理

1.约束 定义约束:限制质点或者质点系运动的条件称为约束,表示这些限制条件的数学方程称为约束方程。 (1)几何约束 限制质点或者质点系在空间的几何位置的条件称为几何约束.如单摆,其中质点M可绕固定点O在平面Oxy内摆动,摆长为l.这时摆杆对质点的限制条件是:质点M必须在以点O为圆心,以l为半径的圆周上运动.其约束方程为: 又质点M在固定的曲面上运动,那么曲面方程就是质点M的约束方程,即 上...

l93919861的博客 4512

如何求最大子数组之和

问题概述: 有一个长度为n的数组,这n个元素可以使正数也可以是负数,数组中连续的一个或多个元素可以组成一个连续的子数组,一个数组可以有多个这样连续的子数组,求子数组各个元素和的最大值。 方法一:蛮力法 找出所有子数组元素,进行求和,然后找到和的最大值 public static int findSecond(int[] arr){ int n = arr.length; int thisSum= 0; int maxSum = 0; fo

nihaoma1203的博客 1669

LM358实战:手把手教你搭建电流检测电路(附电阻选型计算)

本文详细解析了使用LM358运算放大器搭建电流检测电路的全过程,包括基础原理、采样电阻选型、放大电路设计及PCB布局技巧。通过实战案例和精确计算,帮助工程师快速掌握低成本、高精度的电流检测方案,适用于电源管理、电机控制等多种应用场景。

weixin_30872157的博客 451

贪心算法与动态规划求最大子数组的和

求最大子数组的和法一:贪心算法求最大子数组的和核心思路过程分析代码如下(Java语言描述)法二:动态规划求最大子数组和核心思路过程演示代码如下(Java语言描述) 该博客是本人在学习基础算法过程的点滴,将他们记录下来,方便日后查阅。如有错误之处,请各位看官指正。本人联系方式 jenson_97@163.com,期望与大神们交流。 转载请注明出处 法一:贪心算法求最大子数组的和 核心思路 设置一个游标,用于遍历求和,当游标小于0时抛弃之前的遍历过程,并将游标置0继续向后遍历 这里以数组 nums [-2, 5

weixin_44684539的博客 1273

别再凭感觉估算!用ADS的EBOND库精确仿真Bonding线寄生电感(附完整参数设置指南)

本文详细介绍了在ADS中使用EBOND库精确仿真Bonding线寄生电感的方法,帮助射频工程师在毫米波频段实现高精度建模。通过三维物理参数和电磁场求解算法,EBOND模型能将误差控制在5%以内,显著提升电路性能。文章还提供了完整的参数设置指南和实战操作步骤,适用于5G毫米波前端模块等高频应用场景。

weixin_28730131的博客 507

26. Fabric2.2 司法存证的智能合约分析

有很多同学反馈 Fabric 智能合约读起来比较费劲,对于新手不友好看不懂,这里选择一个司法存证的智能合约,阅读、分析智能合约基础框架与核心流程代码,培养大家智能合约编写的方法论。

菜鸟的博客 1340

求最大子数组

<br />题目:<br /> <br />      给定一个数组,当中有正负数,求当中的一段“子数组”(即任意长度,连续的数字),使得这个“子数组”的和是所有“子数组”和中最大的,<br />如给定的数组为12, -8, 5, 66, -21, 0 ,35, -44,7,则最大的和的子数组为{12, -8, 5, 66, -21, 0 ,35},最大的和为89.<br /> <br /> <br /> <br />思路:<br />  1.从第一个正数开始,从左往右依次相加元素,当累加的值不小于零时就继

Anssin007的专栏 2570

多模态论文笔记——BLIP

本文详细介绍这几年AIGC火爆的隐藏功臣,多模态模型:BLIP。

haopinglianlian的博客 2454

C语言实现求最大子数组之和

问题描述:求最大子数组之和,如-3 2 1 -2 5 -6 3的最大子数组为2 1 -2 5,最大子数组和为6。 #include<stdio.h> #define N 88 int maxSubarry(int a[],int m){ int ThisSum,MaxSum; int i; ThisSum=MaxSum=0; for(i=0;i<m;i++){ ThisSum+=a[i]; if(ThisSum>MaxSum) MaxSum=ThisSum; else if(This

谋天下的博客 2534

《C++等级认证CCF-GESP真题解析》专栏总目录

❤️ 专栏名称:《C++等级认证CCF-GESP真题解析》🌸 专栏介绍:中国计算机学会GESP《CCF编程能力等级认证》C++编程(1~8级)历届真题解析。🚀 订阅专栏:订阅后可阅读专栏内所有真题解析,真题持续更新中,欢迎订阅!

人生就是一个不断学习的过程 6300

Statistics and Machine Learning Toolbox

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

【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

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java 求最大子数组

Background 在某天购入股票后抛出,求如何取得最大利润。已知股票趋势如图所示。 Thought 我们都知道——利润 = 售价 - 成本,即两者之差越大则利润越大。要求利润的最大值,不妨先计算出当天与前一天股价的差,得到的股价浮动数组,然后找其最大子数组,即为原问题的解。 对于最大子数组,最简单粗暴的方法就是两层 for,遍历所有子数组后,自然能求出最大子数组。 更好的解决办法是用分...

深刻的博客 1397

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

递归算法求最大的子数组的和

题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组和18以及起始的下标2,6。 分治策略,运行时间是nlogn 使用分治技术意味着我们要将子数组划分为两个规模尽量相等的...

工大机器人工作室 514

分治——求最大子数组

问题描述 给定一个数组array[],数组元素均为整数(有正有负),求取其中一部分字串,使其和最大,输出最大的和与该字串的在原数组的头尾位置。 问题分析 1、暴力求解:在数组长度为nnn的数组中两两组合共有Cn2C^2_nCn2​种,因为Cn2=Ω(n2)C^2_n = \Omega(n^2)Cn2​=Ω(n2),因此这种方法的时间复杂度为O(n2)\Omicron(n^2)O(n2). 2...

Dainelcw 1331

java求连续子数组的和最大

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

li_zhenxing的专栏 3229

算法——【最大子数组和】

比如:数组长度为 n ,我们用 i 表示子数组起点,从0到 n-1 依次遍历,每固定一个 i 就让 j 从 i 遍历到 n-1 ,同时累加从 i 到 j 的和,每算一次就和当前最大值比较并更新最大值,直到 i 遍历完所有位置,这样所有连续子数组都被我们检查了一遍,最后得到的最大值就是我们要求的答案了。示例1中的最大子数组就是[4,-1,2,1]这一段,他的元素和是6,是所有子数组中元素和最大的,所以6就是这个问题的答案。核心思想:把大问题拆成小问题,然后小问题解决后再合并,最终得到大问题的答案。

2402_83493359的博客 817
上一篇: 算法实践篇-冒泡排序
下一篇: 算法实践篇-2的n次方方正相乘普通方法,递归方法以及strassen方法
hxpjava1
博客等级 码龄19年 1365粉丝 511原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hxpjava1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值