求数组的子数组之和的最大值

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

1  蛮力法:

   从第一个元素开始的子序列有A[0],A[0]-A[1],....A[0]-A[i],...A[0]-A[n-1]

   从第i个元素开始的子序列有]..A[i,A[i]-A[i+1],...A[i]-A[n]

   如此我们只需把每一种情况求出来进行比较即可得到结果

  第i个元素都是是N-i次计算

  共有N个元素 那么复杂度位 N-1+(N-2)+....1 = O(N^2)


2 分治法

   把数组分成2段,分别求出这两段的最大子数组的和,那么最大的子序列只可能是左边最大的或者右边最大的,或者跨越中间的元素的一段(求这个需要遍历数组一遍)

   由于N个元素二分成log2(N)次,每一次往下分解都需要遍历数组一次(每一次往下分解将遍历的子数组加起来就相当于遍历整个数组),也就是需要N*log2N次,因而复杂度位N*log2N


3 减治法

  假如我们知道A[i+1]-A[n-1]的最大子数组和位Max[i+1],从A[i+1]开始的最大子序列位Start[i+1],那么我们接下来分析A[i]-A[n-1]对应的最大子数组和以及从A[i]开始的start[i]

我说包含A[i]之后A[i]-A[n-1]子序列最大的值为Max(A[i],A[i]+start[i+1],max[i+1]); 为什么呢?

(1) 假如最大子序列不包含A[i] 那么最大值是不是max[i+1]呢?

(2) 假如最大子序列包含A[i] ,那么最大值情况是不是A[i]或者A[i]+start[i+1]呢 你想假如start[i+1]是在m这个位置结束的,那么假如包含A[i]并且序列越过或者在m左边的序列(这里这个序列不仅仅包含A[i]),一定比A[i]+start[i+1]小,那么仅仅包含A[i]的情况则是start[i+1]小于0了

还有一个问题,我们如何求start[i]呢?

很简单,要么是A[i]要么是A[i]+start[i+1] ,道理与上面类似

这里我们只需要遍历一次数组既可以求出最大值 因而复杂度为O(N)

测试代码如下:

http://download.youkuaiyun.com/detail/learniting/4618388




 

  

  

   


求数组的连续子数组之和的最大值(一维二维) 求数组的连续子数组之和的最大值 输入一个N个元素的整型数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。 例如输入的数组为-9  -3  -2  2  -1  2  5  -7  1  5,和最大的子数组为2  -1  2  5。因此输出为该子数组的和8。 可是如果都是负数的话,要返回0?还是返回最小的负数?,这个数时 阅读详情

相关推荐

Ubuntu Server 22.04.5系统安装教程

该教程主要是演示在服务器上安装Ubuntu server 22.04系统的详细步骤,主要包含,安装系统前的准备(镜像的下载,启动盘的制作),安装系统时的语言选择,网络设置,切换镜像源(可根据实际需求来配置,本文使用清华镜像源),手动分区,用户设置,ssh服务安装等。以上就是关于Ubuntu Server 22.04系统安装的详细过程。

逆水行舟,不进则退。 7761

动态规划例子:子列表元素之和的最大值。

说明:子列表指的是列表中索引(下标)连续的元素构成的列表;列表中的元素是int类型,可能包含正整数、0、负整数;程序输入列表中的元素,输出子列表元素求和的最大值,例如: 输入:1 -2 3 5 -3 2 输出:8 输入:0 -2 3 5 -1 2 输出:9 输入:-9 -2 -3 -5 -3 输出:-2 def main(): items = list(map(int, input().split())) overall = partial = items[0] fo

秋月银鸽的博客 528

TCP Reno/CUBIC 拥塞控制算法对比:从 Tahoe 到 BBR 的 4 种核心策略演进

本文深入解析了TCP拥塞控制算法的演进历程,从经典的Tahoe、Reno到现代的CUBIC和BBR,详细对比了4种核心策略的实现机制与性能差异。通过分析拥塞窗口、流量控制等关键技术,揭示了不同算法在高带宽延迟网络中的优化方向,为网络协议栈优化提供理论依据和实践指导。

weixin_33725239的博客 441

python算法之分治算法(连续子列表的最大和)

连续子列表的最大和 在一个列表中找到连续子列表的最大和。列表中的数字可负可正,并且子列表不能为空。 问题提出: 找到以下列表的最大子列表的和: [-2,1,-3,4,-1,2,1,-5,4] 解题思路 最大子列表有可能在左子列表、右子列表与右子列表之间。我们需要做的是找到左子列表的最大子列表的和、右子列表的最大子列表的和、左子列表与右子列表之间的子列表的最大和,再进行比较。 三种可能: 如何找到左子列表与右子列表的最大子列表的和呢? 分治的想法是:让左子列表与右子歹表的子列表回答这个问题就可以了,此时此刻

sjjsaaaa的博客 1116

进程间通信的七种方法实战演示!值得收藏!

线程和进程间的通讯(Inter-Process Communication, IPC)是操作系统中的一个重要概念,用于实现不同进程或同一进程中的不同线程之间的数据交换和协调。以下是几个常见的进程间通信的方式:管道、消息队列、共享内存、信号、套接字、信号量、文件映射

十年饮冰,难凉热血,保持热爱,奔赴星海! 2816

Proteus快速入门(最详细教程)

Proteus 是一款用于嵌入式单片机仿真的软件,用于在打PCB板之前对软件程序和硬件电路的正确性进行仿真验证。1.所以Proteus一般会和Keil软件进行联合仿真,在Proteus中绘制系统的电路图,在Keil软件中编写对应的程序后生成Hex文件。2.Proteus的仿真结果仅供参考,只能在一定程度上验证系统的可能性。实际实物系统还需要进行进一步的调试。以上即为本次分享的Proteus入门教程的全部内容,希望可以能够帮助到各位道友。

ediykk的博客 15万+

java实现求最大子数组和

leetCode算法题

weixin_61876893的博客 1166

三菱FX5U系列PLC与汇川IT6000系列触摸屏进行MODBUS TCP通信的具体方法

三菱FX5U系列PLC与汇川IT6000系列触摸屏进行MODBUS TCP通信的具体方法

Robot_PLC_HMI_Automation 6515

子数组之和的最大值

给定一个数组,查找这个数组的子数组的最大和比如{-2,5,3,-6,4,-8,6}输出最大和8分析:假设已经找到一个子数组的最大和,这个子数组是从数组索引i到索引j。可以用如下式子描述,cur_max = a[i , j]; 对于下一个数,也就是索引为j+1,这个最大和是否将a[

songjiano的专栏 733

风光储并网对电力系统稳定性影响的仿真研究

本文研究了风光储并网对电力系统稳定性的影响,基于MATLAB/Simulink平台搭建了IEEE 9节点测试系统的风光储并网模型。研究对比了光储、风储和风光储三种并网配置在多种干扰下的稳定性表现。结果表明:光储系统对频率变化最敏感,风储系统具有更强的功率波动适应能力,而风光储联合系统通过互补效应展现出最佳综合稳定性。储能系统在所有配置中均显著改善了频率恢复性能,验证了其在新能源并网中的关键支撑作用。研究为高比例可再生能源电力系统的稳定运行提供了仿真依据和技术参考。

huanghm88的专栏 154

FanucROBOGUIDE软件二次开发:使用ROBOGUIDEAPI进行编程

菜单栏:位于界面顶部,提供文件、编辑、视图、插入、格式、工具、窗口和帮助等选项。工具栏:包含常用的工具按钮,如新建、打开、保存、运行、停止、机器人控制等。工作站视图:显示工作站的3D模型,用户可以在这里放置机器人、工件、工具和其他设备。机器人控制面板:用于控制机器人运动,包括手动移动、程序编辑和运行。程序编辑器:在这里可以编写和编辑机器人程序,支持Fanuc的R-30iB Plus和R-30iB控制柜的程序格式。状态栏:显示当前工作站的状态信息,如机器人位置、程序状态等。

kkchenjj的博客 1408

[编程之美] 2.14 求数组的子数组之和的最大值

给定一个包含N个整数的数组,求数组的子数组之和的最大值。

追寻梦想的青春 1405

HarmonyOS应用开发者基础认证

B. 自定义组件:可复用的 UI 单元,可组合其它组件。D. 内置组件:ArkTS中默认内置的基本组件和布局组件,开发者可以直接调用,如Column、Text、Divider、Button等。E. 属性方法:用于组件属性的配置,统一通过属性方法进行设置,如fontSize()、width()、height()、color() 等。在Column和Row容器组件中,justifyContent用于设置子组件在主轴方向上的对齐格式,alignItems用于设置子组件在交叉轴方向上的对齐格式。

牛肉胡辣汤 3818

求数组中的子数组之和的最大值

《编程之美》第2.14节:求数组中的子数组之和的最大值 题目:有一个有N个元素组成的一维数组,这个数组中当然有很多子数组,那么子数组之和的最大值是多少? 解法:从头到尾遍历整个数组,不断加和,如果临时和temp 代码如下: #include #include using namespace std; int subarrySum(int *A,int N)//返回要排除的值 { int

u010585135的专栏 2061

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

算法-求数组的子数组之和的最大值

一个一维int数组,这个数组有很多子数组,那么子数组之和的最大值是什么呢? 思考   1、题目说的子数组是连续的;   2、题目只需要求和,并不需要返回子数组的具体位置;   3、数组的元素是整数,所以数组可能包含有正整数、零、负整数; 举几个例子:   数组:[1, -2, 3, 5, -3, 2]应返回:8   数组:[0, -2, 3, 5, -1, 2]应返回:9   数组:[-9, -2, -3, -5, -3]应返回:-2,这也是最大子数组的和。 【解法一】:   直接的方法,记Sum[i,…,

天佑木枫 2114

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

求数组的子数组之和最大值

题目:一个有N个整数元素的一维数组A[0...n-1]这个数组you

小菜鸟 379

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

求数组的子数组之和的最大值。

求数组的子数组之和的最大值。 解法1:分治法,将所给数组A[0],…A[n-1]分为长度相等的两段数组A[0],…,A[n/2-1]和A[n/2],…,A[n-1],分别求出这两段数组各自的最大子段和,则原数组的最大子段和为以下三种情况的最大值: 1. A[0],…A[n-1]的最大子段和与A[0],…,A[n/2-1]的最大子段和相同; 2. A[0],…A[n-1]的最大子段和与A[n/

我的读书笔记(2011-2013) 1054
上一篇: 最大子数组乘积
下一篇: 三个自然数的积为1986,和为338,求这三个自然数
LearnITing
博客等级 码龄15年 14粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值