前几天在微信订阅号“待字闺中”中看到的一篇文章《小技巧求一个数组中子数组的最大和》,提供下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实现)相关推荐

  1. java可存储100个整数的数组_定义一个一维整数数组,其中储存1000个1至100以内的整数,并统计出整数出现的次数(Java写出来)...

    代码如下: import java.util.Hashtable; import java.util.Random; public class Demo { public static void ma ...

  2. java求长方形面积_求一个,用Java编写一个求长方形的面积和周长的程序,(面向对象)....

    满意答案 daikuanii 推荐于 2017.11.23 采纳率:50%    等级:12 已帮助:4607人 //看看我这个程序把 比较符合面向对象的思想,告诉搂住一声,尽量把一些程序写尽方法里, ...

  3. java smtp收信_求一个简单java编写的邮件收发程序,邮件发送程序为smtpsend,邮件接收程序为popreceive。急需,感谢。...

    展开全部 import javax.mail.*; import javax.mail.internet.*; import java.util.*; import java.io.*; public ...

  4. java 山寨qq源代码_求一个山寨qq的源代码,要java语言的~谢谢

    展开全部 简单得很的那种要不要?就像用来应对考试一样.import java.io.*; import java.net.*; import java.util.*; public class Cha ...

  5. python求二维数组各行最大值_python+numpy按行求一个二维数组的最大值方法

    问题描述: 给定一个二维数组,求每一行的最大值 返回一个列向量 如: 给定数组[1,2,3:4,5,3] 返回[3:5] import numpy as np x = np.array([[1,2,3 ...

  6. 求一个有序整数数组中和为K的数的对数

    题目: 求一个有序整数数组中和为K的数的对数. 解决方案: 两个指针,一个在头,一个在尾: 大则-,小则加. 延伸题目: (1)求整数数组中和为K的对数. 先排序,O(N*logN),在按照以上算法查 ...

  7. 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所指一维数组中.二维数组中的数已在主函数中 ...

  8. python中求二维列表的最大最小值_python+numpy按行求一个二维数组的最大值方法

    python+numpy按行求一个二维数组的最大值方法 问题描述: 给定一个二维数组,求每一行的最大值 返回一个列向量 如: 给定数组[1,2,3:4,5,3] 返回[3:5] import nump ...

  9. 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所指一维数组中.二维数组中的数己在主函数中赋予. ...

最新文章

  1. 使用Repeater的Template
  2. Autodesk Infrastructure Map Server 2014的开发文档在哪里?
  3. [jQuery]10 Things I Learned from the jQuery Source
  4. CRITICAL_SECTION 学习
  5. Python数据分析入门(四)
  6. 【OpenCV 例程200篇】97. 反谐波平均滤波器
  7. 零元学Expression Blend 4 - Chapter 3 熟悉操作第一步(制作一个猴子脸)
  8. memset()函数及其作用
  9. Android 深度学习gan网络,使照片变为动漫化风格,毕业设计源码,android studio编译
  10. 网易云信IMweb版集成实现(PHP直接上码)
  11. Android 六大布局
  12. xv6 CPU alarm
  13. 【实习之路】投了109份简历,幸运的大二菜鸡终于拿到欢聚时代的offer了!!
  14. 赠与今年的大学毕业生
  15. Linuxshell脚本之循环语句
  16. 数据处理之Pandas中数据类型转换
  17. 只需10分钟,给你全世界!水经注全球三维离线GIS系统
  18. 关于open3d的入门到放弃
  19. 暴笑口误2007贺岁版出炉喽!!(转载)
  20. PHP rsa私钥pkcs8加密,Openssl rsa私钥的PKCS#1和PKCS#8格式以及加密和转化

热门文章

  1. SignalTap II逻辑分析仪的使用
  2. 【洛谷3377】 左偏树(可并堆)
  3. org.apache.poi 读取数字问题
  4. 解决spring配置c3p0连接池,tomcat无法正常启动
  5. UIPopoverController的使用
  6. java 简单跳台阶和变态跳台阶
  7. python中的os操作文件,文件路径
  8. SimpleUpdater.NET
  9. Java之SPI机制
  10. 关于微信红包的架构思考