java 最大子数组_求一个数组中子数组的最大和算法(Java实现)
前几天在微信订阅号“待字闺中”中看到的一篇文章《小技巧求一个数组中子数组的最大和》,提供下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. 总结
该算法可以适用于任何数值数组,和数组中数组的正负无关。
java 最大子数组_求一个数组中子数组的最大和算法(Java实现)相关推荐
- java可存储100个整数的数组_定义一个一维整数数组,其中储存1000个1至100以内的整数,并统计出整数出现的次数(Java写出来)...
代码如下: import java.util.Hashtable; import java.util.Random; public class Demo { public static void ma ...
- java求长方形面积_求一个,用Java编写一个求长方形的面积和周长的程序,(面向对象)....
满意答案 daikuanii 推荐于 2017.11.23 采纳率:50% 等级:12 已帮助:4607人 //看看我这个程序把 比较符合面向对象的思想,告诉搂住一声,尽量把一些程序写尽方法里, ...
- java smtp收信_求一个简单java编写的邮件收发程序,邮件发送程序为smtpsend,邮件接收程序为popreceive。急需,感谢。...
展开全部 import javax.mail.*; import javax.mail.internet.*; import java.util.*; import java.io.*; public ...
- java 山寨qq源代码_求一个山寨qq的源代码,要java语言的~谢谢
展开全部 简单得很的那种要不要?就像用来应对考试一样.import java.io.*; import java.net.*; import java.util.*; public class Cha ...
- python求二维数组各行最大值_python+numpy按行求一个二维数组的最大值方法
问题描述: 给定一个二维数组,求每一行的最大值 返回一个列向量 如: 给定数组[1,2,3:4,5,3] 返回[3:5] import numpy as np x = np.array([[1,2,3 ...
- 求一个有序整数数组中和为K的数的对数
题目: 求一个有序整数数组中和为K的数的对数. 解决方案: 两个指针,一个在头,一个在尾: 大则-,小则加. 延伸题目: (1)求整数数组中和为K的对数. 先排序,O(N*logN),在按照以上算法查 ...
- 13.请编一个函数void fun(int tt[M][N],int pp[N]),tt指向一个M行N列的二维数组,求出二维数组每列中最小元素,并依次放入pp所指一维数组中。
13.请编一个函数void fun(int tt[M][N],int pp[N]),tt指向一个M行N列的二维数组,求出二维数组每列中最小元素,并依次放入pp所指一维数组中.二维数组中的数已在主函数中 ...
- python中求二维列表的最大最小值_python+numpy按行求一个二维数组的最大值方法
python+numpy按行求一个二维数组的最大值方法 问题描述: 给定一个二维数组,求每一行的最大值 返回一个列向量 如: 给定数组[1,2,3:4,5,3] 返回[3:5] import nump ...
- C语言编程>第七周 ⑧ 请编一个函数void fun(int a[M][N],int b[N]),c指向一个M行N列的二维数组,求出二维数组每列中最大元素,并依次放入b所指一维数组中。
例题:请编一个函数void fun(int a[M][N],int b[N]),c指向一个M行N列的二维数组,求出二维数组每列中最大元素,并依次放入b所指一维数组中.二维数组中的数己在主函数中赋予. ...
最新文章
- 使用Repeater的Template
- Autodesk Infrastructure Map Server 2014的开发文档在哪里?
- [jQuery]10 Things I Learned from the jQuery Source
- CRITICAL_SECTION 学习
- Python数据分析入门(四)
- 【OpenCV 例程200篇】97. 反谐波平均滤波器
- 零元学Expression Blend 4 - Chapter 3 熟悉操作第一步(制作一个猴子脸)
- memset()函数及其作用
- Android 深度学习gan网络,使照片变为动漫化风格,毕业设计源码,android studio编译
- 网易云信IMweb版集成实现(PHP直接上码)
- Android 六大布局
- xv6 CPU alarm
- 【实习之路】投了109份简历,幸运的大二菜鸡终于拿到欢聚时代的offer了!!
- 赠与今年的大学毕业生
- Linuxshell脚本之循环语句
- 数据处理之Pandas中数据类型转换
- 只需10分钟,给你全世界!水经注全球三维离线GIS系统
- 关于open3d的入门到放弃
- 暴笑口误2007贺岁版出炉喽!!(转载)
- PHP rsa私钥pkcs8加密,Openssl rsa私钥的PKCS#1和PKCS#8格式以及加密和转化