求最大子数组之和的方法解析(2种可选)
发布时间 - 2026-01-10 22:03:59 点击率:次问题描述:一个有n个元素的数组,这n个元素可以是正数也可以是负数,求最大子数组的和。

方法1:蛮力法
思路:最简单也是最容易想到的方法就是找出所有子数组,然后求所有子数组的和,在所有子数组的和中取最大值。
/**
* 方法1(蛮力法):两次循环求最大子数组之和
*/
public static int maxSubArray1(int[] a){
int i,j;
int ThisSum=0;
int MaxSum=0;
for (i = 0; i < a.length; i++) {
ThisSum=a[i];
for(j=i+1;j<a.length;j++){
ThisSum+=a[j];
if(ThisSum>MaxSum){
MaxSum=ThisSum;
}
}
}
return MaxSum;
}
方法2:优化的动态规划
思路:首先可以根据数组的最后一个元素a[n-1]与最大子数组的关系分为以下三种情况:
1) 最大子数组包含a[n-1],即以a[n-1]结尾。
2) a[n-1]单独构成最大子数组。
3) 最大子数组不包含a[n-1],那么求a[1,...,n-1]的最大子数组可以转换为求a[1,...,n-2]的最大子数组。
通过上述分析可以得出如下结论:假设已经计算出(a[0],...a[i-1])最大的一段数组和为All[i-1],同时也计算出(a[0],...a[i-1])中包含a[i-1]的最大的一段数组和为End[i-1],
则可以得出如下关系:All[i-1]=max{a[i-1],End[i-1],All[i-1]}。利用这个公式和动态规划的思想解决问题。(代码中还解决了起始位置,终止位置的问题)
/**
* 方法2:优化的动态规划方法
* nEnd就是通过“数组依次相加加到a[i],然后与a[i]做比较”得来的,保存较大的。因为如果前面的数加到a[i]
* 还没有a[i]本身大,那么前面的数也就对最大子数组和没有贡献。厉害
* nAll就是记录一下之前的新得到的nEnd和自身之前谁更大
*/
public static int max(int m,int n){
return m>n?m:n;
}
public static int maxSubArray2(int[] a){
int nAll=a[0];//有n个数字数组的最大子数组之和
int nEnd=a[0];//有n个数字数组包含最后一个元素的子数组的最大和
for (int i = 1; i < a.length; i++) {
nEnd=max(nEnd+a[i],a[i]);
nAll=max(nEnd, nAll);
}
return nAll;
}
private static int begin=0;
private static int end=0;
/**
* 求出最大子数组的开始begin,结尾end,以及整个子数组
*/
public static int maxSubArray3(int[] a){
int maxSum=Integer.MIN_VALUE;
int nSum=0;
int nStart=0;
for (int i = 0; i < a.length; i++) {
if(nSum<0){
nSum=a[i];
nStart=i;
}
else{
nSum+=a[i];
}
if(nSum>maxSum){
maxSum=nSum;
begin=nStart;
end=i;
}
}
return maxSum;
}
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# 最大
# 子数组
# 和
# php数组函数序列之array_sum() - 计算数组元素值之和
# C语言求连续最大子数组和的方法
# 求子数组最大和的解决方法详解
# 求子数组最大和的实例代码
# 求出
# 计算出
# 还没有
# 更大
# 两次
# 三种
# 解决问题
# 则可
# 可以根据
# 就对
# 最简单
# 最容易
# 得来
# 即以
# 大和
# 中取
# 不包含
# 为求
# 解决了
# 分为以下
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何确保FTP站点访问权限与数据传输安全?
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
javascript基于原型链的继承及call和apply函数用法分析
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】
Win11怎么开启自动HDR画质_Windows11显示设置HDR选项
Laravel distinct去重查询_Laravel Eloquent去重方法
Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能
Laravel中的Facade(门面)到底是什么原理
在线制作视频的网站有哪些,电脑如何制作视频短片?
Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID
Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
html5的keygen标签为什么废弃_替代方案说明【解答】
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
香港服务器网站推广:SEO优化与外贸独立站搭建策略
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
如何快速查询网站的真实建站时间?
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
Laravel路由怎么定义_Laravel核心路由系统完全入门指南
高性价比服务器租赁——企业级配置与24小时运维服务
如何确保西部建站助手FTP传输的安全性?
Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权
JS经典正则表达式笔试题汇总
清除minerd进程的简单方法
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
公司网站制作价格怎么算,公司办个官网需要多少钱?
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
如何用PHP快速搭建高效网站?分步指南
Laravel怎么在Blade中安全地输出原始HTML内容
Swift中swift中的switch 语句
php485函数参数是什么意思_php485各参数详细说明【介绍】
如何做网站制作流程,*游戏网站怎么搭建?
Laravel如何为API生成Swagger或OpenAPI文档
韩国服务器如何优化跨境访问实现高效连接?
🚀拖拽式CMS建站能否实现高效与个性化并存?
WordPress 子目录安装中正确处理脚本路径的完整指南
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
JavaScript中如何操作剪贴板_ClipboardAPI怎么用
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
三星、SK海力士获美批准:可向中国出口芯片制造设备
iOS中将个别页面强制横屏其他页面竖屏
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
如何在建站主机中优化服务器配置?
如何在建站宝盒中设置产品搜索功能?

