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();
}
}
相关推荐
算法导论——分治算法求最大子数组
算法导论——分治算法求最大子数组 问题描述:求一个数组中的连续子数组,该连续子数组的和的值最大。 解决方法: 最为直观的方法就是暴力破解了吧,也就是直接求出该数组的每一个子数组,进一步求和,选取其中最大值。但是暴力法的时间复杂度比较高,为O(n^2),这里不贴代码了,因为是刚好学到了分治算法。 分治算法求解:具体思路如下 1.求一个数组中的最大子数组,利用分治算法,首先第一步需要做的就是将该数...
最大子数组问题(分治策略)——JAVA代码
问题描述: 分析: 先做处理,简单处理成每一天股票变化的净值。 故问题简化为在数组 {13 -3 -25 20 -3 -16 -23 18 20 -7 12 -5 -22 15 -4 7} 中找出子数组中,元素加和最大的问题。 简单思路:暴力法来求解问题,简单的对每种买进和卖出进行日期组合,共有Cn2种组合,故其时间复杂度为O(n^2)。 分治策略: 我们来思考如何用分治技术来求解最大子数组问题。假定我们要寻找子数组A[ low. . high]的最大子数组。使用分治技术意味着我们要将子数组划分为两个规
求最大子数组的和,以及求该最大子数组的起始位置和末尾位置
问题描述: 一个数组,长度为N,数组元素有负有正,如{-1, 4, 6, -3, 7, -3, -3, 9};我们可以清楚的知道最大的子数组应该是4到9,也就是下标1到下标7,和为17。 求解思路: 第一种方法:我们可以用定义1、两个数ThisSum和MaxSum来记录当前数组的和,以及数组的最大和。 2、我们可以用两个for循环来来遍历数组,每一次求出子数组的最大和,每个子数组从
求最大子数组的三种方法
(1)暴力求解,运行时间是n² int ans = -1000000; for(int i=0; i<n; i++) { int sum = 0; for(int j=i; j<n; j++) { sum += nums[j]...
给定一个数组,求数组的最大连续子数组,使得该子数组的和最大
最大连续子数组 给定一个数组,求数组的最大连续子数组,使得该子数组的和最大 解释 因为昨天的算法题还有别方法没写,直接复制昨天的内容,在此基础进行跟进 暴力法 直接先上代码 function maxSubarray(arr) { let maxSum = arr[0] let startIndex = 0 let endIndex = 0 for (let i ...
分治法求最大子数组问题
分治法求最大子数组问题 1、最大子数组问题: 在长度为n的一维数组中,求一个元素相加后和最大的连续子数组。 2、暴力求解 求得这样的连续数组,暴力求解就是从第一个元素开始,分别计算1个,2个,3个……直到n个元素的和并进行比较,再从第2个元素开始,计算n-1个数组的和……最后计算第n个元素开始的数组,也就只有它本身一个元素的数组,这样计算下来算法的复杂度在n...
分治法求最大子数组
求最大子数组: 一给定好的数组,在不改变起排列顺序的情况下,求非空的求和最大的子数组。 思路:把原数组分成两半,分别求两半的最大子数组,再求这两半合并后从中间往两边的最大子数组。然后把这三部分比较,得到整个的最大子数组。 例子:先分,如图 再治: 上代码: #include<iostream> using namespace std; #include<limits.h> int max(int a, int b, int c) { return a > (b >
GBT 27930-2015/2023国标充电协议A类CAN报文ID说明
国标充电CAN的ID,仅供学习参考。
Kadane 算法详解:求最大连续子数组和
设。
长短期记忆网络(LSTM)预测模型及其Python和MATLAB实现
LSTM 通过独特的门控机制解决了传统 RNN 的梯度消失和梯度爆炸问题,使其在处理长序列时具有显著优势。随着技术的不断发展,LSTM 及其变种(如 Bi-directional LSTM、Stacked LSTM 等)有望在更复杂的任务中发挥重要作用。2. **可视化真实值和预测值**:通过绘图来比较真实值和预测值,判断模型的准确性。2. **输入门(Input gate)**:决定当前的输入信息对细胞状态的影响。1. **细胞状态(Cell state)**:保持信息在时间步之间的传递。
结构力学程序算法理论基础(一)————虚功原理
1.约束 定义约束:限制质点或者质点系运动的条件称为约束,表示这些限制条件的数学方程称为约束方程。 (1)几何约束 限制质点或者质点系在空间的几何位置的条件称为几何约束.如单摆,其中质点M可绕固定点O在平面Oxy内摆动,摆长为l.这时摆杆对质点的限制条件是:质点M必须在以点O为圆心,以l为半径的圆周上运动.其约束方程为: 又质点M在固定的曲面上运动,那么曲面方程就是质点M的约束方程,即 上...
如何求最大子数组之和
问题概述: 有一个长度为n的数组,这n个元素可以使正数也可以是负数,数组中连续的一个或多个元素可以组成一个连续的子数组,一个数组可以有多个这样连续的子数组,求子数组各个元素和的最大值。 方法一:蛮力法 找出所有子数组元素,进行求和,然后找到和的最大值 public static int findSecond(int[] arr){ int n = arr.length; int thisSum= 0; int maxSum = 0; fo
LM358实战:手把手教你搭建电流检测电路(附电阻选型计算)
本文详细解析了使用LM358运算放大器搭建电流检测电路的全过程,包括基础原理、采样电阻选型、放大电路设计及PCB布局技巧。通过实战案例和精确计算,帮助工程师快速掌握低成本、高精度的电流检测方案,适用于电源管理、电机控制等多种应用场景。
贪心算法与动态规划求最大子数组的和
求最大子数组的和法一:贪心算法求最大子数组的和核心思路过程分析代码如下(Java语言描述)法二:动态规划求最大子数组和核心思路过程演示代码如下(Java语言描述) 该博客是本人在学习基础算法过程的点滴,将他们记录下来,方便日后查阅。如有错误之处,请各位看官指正。本人联系方式 jenson_97@163.com,期望与大神们交流。 转载请注明出处 法一:贪心算法求最大子数组的和 核心思路 设置一个游标,用于遍历求和,当游标小于0时抛弃之前的遍历过程,并将游标置0继续向后遍历 这里以数组 nums [-2, 5
别再凭感觉估算!用ADS的EBOND库精确仿真Bonding线寄生电感(附完整参数设置指南)
本文详细介绍了在ADS中使用EBOND库精确仿真Bonding线寄生电感的方法,帮助射频工程师在毫米波频段实现高精度建模。通过三维物理参数和电磁场求解算法,EBOND模型能将误差控制在5%以内,显著提升电路性能。文章还提供了完整的参数设置指南和实战操作步骤,适用于5G毫米波前端模块等高频应用场景。
26. Fabric2.2 司法存证的智能合约分析
有很多同学反馈 Fabric 智能合约读起来比较费劲,对于新手不友好看不懂,这里选择一个司法存证的智能合约,阅读、分析智能合约基础框架与核心流程代码,培养大家智能合约编写的方法论。
求最大子数组
<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.从第一个正数开始,从左往右依次相加元素,当累加的值不小于零时就继
多模态论文笔记——BLIP
本文详细介绍这几年AIGC火爆的隐藏功臣,多模态模型:BLIP。
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
《C++等级认证CCF-GESP真题解析》专栏总目录
❤️ 专栏名称:《C++等级认证CCF-GESP真题解析》🌸 专栏介绍:中国计算机学会GESP《CCF编程能力等级认证》C++编程(1~8级)历届真题解析。🚀 订阅专栏:订阅后可阅读专栏内所有真题解析,真题持续更新中,欢迎订阅!
Statistics and Machine Learning Toolbox
Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具
【Java】如何求最大子数组之和
问题描述 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一个有n个元素的数组,这n个元素可以是正数也可以是负数,数组中连续的一个或多个元素可以组成一个连续的子数组,一个数组可能有多个这种连续的子数组,求子数组和的最大值。 输入示例 输入数组{1,-2,4,8,-4,7,-1,-5} 输出示例 最大值:15 其最大和的子数组为{4,8,-4,7}
迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)
迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)
Java 求最大子数组
Background 在某天购入股票后抛出,求如何取得最大利润。已知股票趋势如图所示。 Thought 我们都知道——利润 = 售价 - 成本,即两者之差越大则利润越大。要求利润的最大值,不妨先计算出当天与前一天股价的差,得到的股价浮动数组,然后找其最大子数组,即为原问题的解。 对于最大子数组,最简单粗暴的方法就是两层 for,遍历所有子数组后,自然能求出最大子数组。 更好的解决办法是用分...
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 使用分治技术意味着我们要将子数组划分为两个规模尽量相等的...
分治——求最大子数组
问题描述 给定一个数组array[],数组元素均为整数(有正有负),求取其中一部分字串,使其和最大,输出最大的和与该字串的在原数组的头尾位置。 问题分析 1、暴力求解:在数组长度为nnn的数组中两两组合共有Cn2C^2_nCn2种,因为Cn2=Ω(n2)C^2_n = \Omega(n^2)Cn2=Ω(n2),因此这种方法的时间复杂度为O(n2)\Omicron(n^2)O(n2). 2...
java求连续子数组的和最大
题目描述: 输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)。 思路: 我们可以使用分治法或者减治法来处理这个问题。 分治法 目标:把1个大问题分成2个小问题,2个小问题还可以再分,直到问题规模小的可以简单解决。 将该数组等分成两个子数组,假如知
算法——【最大子数组和】
比如:数组长度为 n ,我们用 i 表示子数组起点,从0到 n-1 依次遍历,每固定一个 i 就让 j 从 i 遍历到 n-1 ,同时累加从 i 到 j 的和,每算一次就和当前最大值比较并更新最大值,直到 i 遍历完所有位置,这样所有连续子数组都被我们检查了一遍,最后得到的最大值就是我们要求的答案了。示例1中的最大子数组就是[4,-1,2,1]这一段,他的元素和是6,是所有子数组中元素和最大的,所以6就是这个问题的答案。核心思想:把大问题拆成小问题,然后小问题解决后再合并,最终得到大问题的答案。
745



被折叠的 条评论
为什么被折叠?



