连续子数组的最大和
2016-03-29 16:57
253 查看
一、思路
最直观的方法:枚举出数组的所有子数组并求出它们的和,一个长度为n的数组,总共有n(n+1)/2个子数组,计算出所有子数组的和,最快也要O(n的平方)的时间,不是最优解法。
分析数组的规律:假如数组为{1,-2,3,10,-47,2,-5},初始化和为0,第一步加上第一个数字1,此时和为1,接下来第二步加上数字-2,和就变成了-1;第三步加上数字3,由于原来累计和为-1,小于0,那如果用-1加上3和就会比3小,也就是说从第一个数字开始的子数组的和会小于从第三个数字开始的子数组的和,因此不用考虑第一个数字开始的子数组,之前累计的和也被抛弃。依次类推,得到最大和。
最直观的方法:枚举出数组的所有子数组并求出它们的和,一个长度为n的数组,总共有n(n+1)/2个子数组,计算出所有子数组的和,最快也要O(n的平方)的时间,不是最优解法。
分析数组的规律:假如数组为{1,-2,3,10,-47,2,-5},初始化和为0,第一步加上第一个数字1,此时和为1,接下来第二步加上数字-2,和就变成了-1;第三步加上数字3,由于原来累计和为-1,小于0,那如果用-1加上3和就会比3小,也就是说从第一个数字开始的子数组的和会小于从第三个数字开始的子数组的和,因此不用考虑第一个数字开始的子数组,之前累计的和也被抛弃。依次类推,得到最大和。
public class Solution { public int FindGreatestSumOfSubArray(int[] array) { boolean invalidInput = false; if(array == null || array.length == 0){ invalidInput = true; return 0; } invalidInput = false; int nCurSum = 0; int nGreatestSum = 0x80000000; for(int i = 0;i < array.length;i++){ if(nCurSum <= 0){ nCurSum = array[i]; }else{ nCurSum += array[i]; } if(nCurSum > nGreatestSum){ nGreatestSum = nCurSum; } } return nGreatestSum; } }
相关文章推荐
- Mac OS X 下安装使用 Docker(旧方法,但有助于理解一些理论)
- Integer与int的区别
- 表单
- AppScan漏洞“已解密的登陆请求”修复解决方案
- Ember.js学习项目源码发布
- 表单
- 基于AFNetWorking 3.0封装网络请求数据的类
- javascript声明提升现象及严格模式
- APS system.webServer error 配置
- AppScan 8.0使用指南笔记(AppScan 系列一)
- java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "javamelody jenkins
- 使用 Nginx Upload Module 实现上传文件功能
- Xcode 项目编译错误debug经验汇总
- 持续更新--git使用笔记
- 软件缺陷管理流程
- 算法训练 动态数组使用
- UVa 11401 - Triangle Countin
- python splinter 小坑说明
- 安装phpMyAdmin出现403解决办法。全部是yum安装
- 【自学笔记】 JavaScript 字符串对象 添加样式