找出一个数组中子数组和的最大值
2016-03-24 09:32
190 查看
让我们看这样一个数组:[1, -2, 3, 4, -5, 6, -7]
很明显,子数组和的最大值是8,这个子数组是[3, 4, -5, 6]
那么我们怎么找到最大值是多少呢?
我们假设从第一位开始对每一位加和,当加到3的时候,我们发现,之前的1+(-2)=-1,如果加上3的话等于2,还不如直接从3开始大一些,这时候我们果断抛弃3前面的计算结果,从3开始重新加和。
当加到-5的时候,我们发现,之前的3+4=7,如果加上-5的话结果变小了,这个时候别急,毕竟加上-5结果2还是大于零的,加上-5的下一位肯定比下一位更大,所以这种时候放心大胆的加上就好。
那么这时候,我们的规则就出来了:
(1)在遍历到第 i 位时,如果当时的子数组加和currentSum<0,那么直接让currentSum = sum[i];
(2)在遍历到第 i 位时,如果当时的子数组加和currentSum>=0,那么让currentSum += sum[i];
(3)别忘了这个步骤:maxSum = Math.max(maxSum, currentSum);
附一下我的代码:
很明显,子数组和的最大值是8,这个子数组是[3, 4, -5, 6]
那么我们怎么找到最大值是多少呢?
我们假设从第一位开始对每一位加和,当加到3的时候,我们发现,之前的1+(-2)=-1,如果加上3的话等于2,还不如直接从3开始大一些,这时候我们果断抛弃3前面的计算结果,从3开始重新加和。
当加到-5的时候,我们发现,之前的3+4=7,如果加上-5的话结果变小了,这个时候别急,毕竟加上-5结果2还是大于零的,加上-5的下一位肯定比下一位更大,所以这种时候放心大胆的加上就好。
那么这时候,我们的规则就出来了:
(1)在遍历到第 i 位时,如果当时的子数组加和currentSum<0,那么直接让currentSum = sum[i];
(2)在遍历到第 i 位时,如果当时的子数组加和currentSum>=0,那么让currentSum += sum[i];
(3)别忘了这个步骤:maxSum = Math.max(maxSum, currentSum);
附一下我的代码:
public int findMaxArray(int[] array){ if (array == null || array.length == 0) { return Integer.MIN_VALUE; } int maxSum = Integer.MIN_VALUE; int currentSum = 0; for (int i = 0; i < array.length; i++) { if (currentSum < 0) { currentSum = array[i]; }else { currentSum += array[i]; } maxSum = Math.max(maxSum, currentSum); } return maxSum; }
相关文章推荐
- c++第二次作业
- 深度学习(三十四)对抗自编码网络-未完待续
- Linux Resin 安装
- ***周鸿祎谈创业:很多程序员高智商 但我一看就知道他们不会成功
- Java文件操作二:File文件的方法
- 如何求解问题:现代启发式方法
- tomcat各目录(文件)作用
- 常用的JQuery函数及功能小结
- U盘安装雨林木风ghost win7的图文教程
- linux管道的那点事
- 青云QingCloud RDS 服务率先支持 MySQL 5.7
- HTCondor python bindings使用
- 享受这一点点的平淡
- iOS从入门到颈椎病发作
- C++实验2-标准体重
- C++作业2
- 享受这一点点的平淡
- ASP.NET-让html代码输出为字符串
- 深入理解java
- android之Widget开发详解