求一个数组中子数组的最大和算法(Java实现)
时间:2022-04-27
本文章向大家介绍求一个数组中子数组的最大和算法(Java实现),主要内容包括1. 原题及解答、2. Java实现、3. 总结、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
前几天在微信订阅号“待字闺中”中看到的一篇文章《小技巧求一个数组中子数组的最大和》,提供下Java的实现,并且在对题目做下小修改,本来打算直接在微信里直接回复,但是发现无法回复,然后整理出一篇简短博客吧。
1. 原题及解答
题目:
输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为 O(n)。例如输入的数组为 1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为 3, 10, -4,7, 2, 因此输出为该子数组的和 18。
解答:
【只有子数组“前半部分”的和为正数时,子数组的求和才有可能最大】,在这个trick条件下,只需要遍历一次数组就可以。算法是:当从头开始遍历的元素的求和为正数时,继续向后遍历。当求和为负数时,重新开始计算求和,子数组的开始重置为下一个元素。
2. Java实现
原文提供的是Python的实现,我这里通过Java来实现:
package subarraymaxsum;
public class MaxSumOfSubArray {
public int maxSum(int[] array) {
if (array == null || array.length == 0) {
throw new IllegalArgumentException("array is null or empty.");
}
int result = array[0], mark = 0;
for (int i = 0; i < array.length; i++) {
int element = array[i];
if (mark >= 0) {
mark += element;
} else {
mark = element;
}
if (mark > result) {
result = mark;
}
}
return result;
}
public static void main(String[] args) {
MaxSumOfSubArray maxSumOfSubArray = new MaxSumOfSubArray();
int maxSum = maxSumOfSubArray.maxSum(new int[]{1, -2, 3, 10, -4, 7, 2, -5});
System.out.println(maxSum);
}
}
输出: 18
其实虽然原题中指出数组里有正数和负数,当时经过实践和思考,这个算法同样适用于全是正数,或者全是负数的情况。当全为正数时,最大的和自然就是所有元素的和,当全为负数时,最大和自然就是其中最大的那个负数的值。通过此算法都能得到相应的结果。
测试代码-全是负数:
public static void main(String[] args) {
MaxSumOfSubArray maxSumOfSubArray = new MaxSumOfSubArray();
int maxSum = maxSumOfSubArray.maxSum(new int[]{-100, -3, -10, -1, -7, -2, -5});
System.out.println(maxSum);
}
输出 -1
测试代码-全是正数:
public static void main(String[] args) {
MaxSumOfSubArray maxSumOfSubArray = new MaxSumOfSubArray();
int maxSum = maxSumOfSubArray.maxSum(new int[]{100, 3, 10, 1, 7, 2, 5});
System.out.println(maxSum);
}
输出 128
3. 总结
该算法可以适用于任何数值数组,和数组中数组的正负无关。
- DP较为完整的知识
- HDUOJ----The Number Off of FFF
- HDUOJ-------Naive and Silly Muggles
- HDUOJ----A Computer Graphics Problem
- HDUOJ---(4708)Herding
- HDUOJ---(4708)Rotation Lock Puzzle
- HDUOJ---Hamming Distance(4712)
- HDUOJ-----Difference Between Primes
- HDUOJ----(4706)Children's Day
- poj-------Common Subsequence(poj 1458)
- poj----Maximum sum(poj 2479)
- HDUOJ---hello Kiki
- HDUOJ-----X问题
- POJ-----C Looooops
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Linux系统组建SVN服务器
- 面向对象学习
- 常用模块
- 代理错误[WinError 10061]
- Linux系统JDK+Tomcat环境安装布署过程
- Python version 3.6 required, which was not found in the registry错误解决
- LNMP架构应用实战——Nginx服务介绍与安装
- 使用tidylib解决不规则网页问题
- LNMP架构应用实战——Nginx服务配置文件介绍
- Mac Sublime Text3快捷键
- Linux系统shell脚本编程——生产实战案例
- 学习python第一天总纲
- 学习python第二天数据库day1
- LNMP架构应用实战——Nginx配置虚拟主机
- 学习python第三天单行函数