最大子数组(最大子数组和)分治法 java代码实现(完整版)递归方式实现(分而治之)

简介: 最大子数组(最大子数组和)分治法 java代码实现(完整版)递归方式实现(分而治之)

什么是最大子数组:

子数组:数组中一段连续的序列
最大子数组:子数组中各个值相加和最大

一般人思维1:

蛮举,把数组中每个子数组都计算一遍
当然这样的算法效率是低下的

一般人思维2:

我们在蛮举的时候会发现其实有很多重复计算的地方,所以我们会想到保存上次相加后的结果,但是这样的算法效率也不够高,其时间复杂度为O(n2).
接下来我将会介绍用分而治之算法思想去解决问题

分而治之思维解决最大子数组问题:

什么是分而治之:

分而治之三步骤:分解原问题,解决子问题,合并问题解
1.分解原问题:将原问题分解为若干个规模较小,相对独立,与原问题形式相同的子问题。
2.解决子问:若子问题规模较小且易于解决时,则直接解。否则,递归地解决各子问题。
3.合并:将各子问题的解合并为原问题的解。

用在最大子数组问题上:

分治法思维,如何分呢,我们可能会联想到归并排序的例子,(不太明白归并排序的读者可点击参考本人另一篇博客:归并排序),那我们能不能用到归并排序的递归思维去解决问呢,把他们划分为一个一个小片段,然后合并起来。
答案当然是可以的,我们可以在归并排序合并这一操作的时候把比较和交换移动步骤改为左半段求最大子数组和,右半段求最大子数组和,左半段和右半段结合起来求最大子数组和,而且我们会发现合并的时候都有左半段的右边和右半段的左边参与相加,考虑到这些,我们就很容易借鉴归并排序的递归思维去解决最大子数组问题。
用这种方法去解决问题时间复杂度能降到:O(nlogn).
如果你还没有看懂这些文字描述,可以结合本人在下面用java所写的代码进行分析,相信你会有所收获。

java完整代码实现(递归方式):

public int toMaxSubarray(int []arr,int left,int right) {
    
    if(left >= right) {
              //递归出口
        return arr[left];
    }
    int mid = (left+right)/2;
    int leftMax = toMaxSubarray(arr, left, mid);            //左半段最大值
    int rightMax = toMaxSubarray(arr, mid+1, right);        //右半段最大值
    int mergeMax = addMaxSubarray(arr,left,mid,right);      //合并的最大值
    //返回三个数中最大的数
    return (leftMax=leftMax>rightMax?leftMax:rightMax)>mergeMax?leftMax:mergeMax; 
}
public int addMaxSubarray(int []arr,int left,int mid,int right) {
    
    int leftMax = (int) Double.NEGATIVE_INFINITY;
    int rightMax = (int) Double.NEGATIVE_INFINITY;
    for(int i = mid,sum = 0;i >= 0;i--) {
        //左半边包含左半边右边元素的最大值
        sum = sum + arr[i];
        if(sum >= leftMax)
            leftMax = sum;
    }
    for(int j = mid+1,sum = 0;j <= right;j++) {
    
        sum = sum + arr[j];
        if(sum>rightMax)
            rightMax = sum;
    }
    int mergeMax = leftMax+rightMax;
    return mergeMax;
}

调用函数及运行截图:

在这里插入图片描述
在这里插入图片描述

博客持续更新中,每天一篇算法博文,欢迎大家关注!

目录
相关文章
|
7天前
|
Java 测试技术 应用服务中间件
常见 Java 代码缺陷及规避方式(下)
常见 Java 代码缺陷及规避方式(下)
26 0
|
9天前
|
Java
Java中ReentrantLock释放锁代码解析
Java中ReentrantLock释放锁代码解析
25 8
|
12天前
|
前端开发 小程序 Java
uniapp上传图片 前端以及java后端代码实现
uniapp上传图片 前端以及java后端代码实现
28 0
|
13天前
|
设计模式 存储 Java
23种设计模式,享元模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享技术有效地支持大量细粒度对象的重用。这个模式在处理大量对象时非常有用,特别是当这些对象中的许多实例实际上可以共享相同的状态时,从而可以减少内存占用,提高程序效率
30 4
|
13天前
|
设计模式 Java 中间件
23种设计模式,适配器模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】适配器模式(Adapter Pattern)是一种结构型设计模式,它的主要目标是让原本由于接口不匹配而不能一起工作的类可以一起工作。适配器模式主要有两种形式:类适配器和对象适配器。类适配器模式通过继承来实现适配,而对象适配器模式则通过组合来实现
30 4
|
14天前
|
存储 缓存 算法
优化 Java 后台代码的关键要点
【4月更文挑战第5天】本文探讨了优化 Java 后台代码的关键点,包括选用合适的数据结构与算法、减少不必要的对象创建、利用 Java 8 新特性、并发与多线程处理、数据库和缓存优化、代码分析与性能调优、避免阻塞调用、JVM 调优以及精简第三方库。通过这些方法,开发者可以提高系统性能、降低资源消耗,提升用户体验并减少运营成本。
|
16天前
|
Java 开发工具 流计算
flink最新master代码编译出现Java Runtime Environment 问题
在尝试编译Flink源码时遇到Java运行时环境致命错误:EXCEPTION_ACCESS_VIOLATION。问题出现在JVM.dll+0x88212。使用的是Java 11.0.28和Java HotSpot(TM) 64-Bit Server VM。系统为Windows客户端,没有生成核心dump文件。错误日志保存在hs_err_pid39364.log和replay_pid39364.log。要解决这个问题,建议检查JDK版本兼容性,更新JDK或参照错误报告文件提交Bug至http://bugreport.java.com/bugreport/crash.jsp。
|
17天前
|
Java
使用Java代码打印log日志
使用Java代码打印log日志
73 1
|
17天前
|
设计模式 Java 数据库
Java设计模式精讲:让代码更优雅、更可维护
【4月更文挑战第2天】**设计模式是解决软件设计问题的成熟方案,分为创建型、结构型和行为型。Java中的单例模式确保类仅有一个实例,工厂方法模式让子类决定实例化哪个类。适配器模式则协调不兼容接口间的合作。观察者模式实现了一对多依赖,状态变化时自动通知相关对象。学习和适当应用设计模式能提升代码质量和可维护性,但需避免过度使用。设计模式的掌握源于实践与不断学习。**
Java设计模式精讲:让代码更优雅、更可维护
|
17天前
|
SQL 设计模式 安全
Java单例模式几种写法以及代码案例拿来直接使用
Java单例模式几种写法以及代码案例拿来直接使用
31 0