面试题31:连续子数组的最大和
2015-07-03 16:56
435 查看
/* * 面试题31:连续子数组的最大和 * 题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n). * 如果要确定最大子数组的位置,需要记录子数组的起始和结束位置 * 解题方法有两种,一是分析数组的规律,二是用动态规划法。 * 分析:当以第i个数字结尾的子数组中所有数字的和小于0时,如果把这个负数与第i+1个数累加,得到的结果比第i+1数字本身要小, * 这种情况以第i+1个数字作为新子数组的开始。当第i个数字结尾的子数组中的所有数字的和大于0时,与第i+1个数字累加。 */ public class FindGreastestSumOfSubarray { private static int begin=0; private static int end=0; public static int FindGreastestSumOfSumarray(int[] arr) { if(arr==null||arr.length<=0) return 0; int nCurrentSum=0; int nGreatestSum=Integer.MIN_VALUE; int nStart=0; for(int i=0;i<arr.length;++i) { if(nCurrentSum<=0){ nCurrentSum=arr[i]; nStart=i; } else nCurrentSum+=arr[i]; if(nCurrentSum>nGreatestSum){//如果当前新得到的子数组的和比以上一个数字结尾的子数组的和大,更新最大和。 nGreatestSum=nCurrentSum; begin=nStart; end=i; } } return nGreatestSum; } public static void main(String[] args) { int[] arr={1,-2,4,8,-4,7,-1,-5}; System.out.println("max="+FindGreastestSumOfSumarray(arr)); System.out.println("being="+begin+",end="+end); } }
相关文章推荐
- 2015爱奇艺暑期实习生面试
- 关于《剑指offer》中面试题30中的第一种算法的推导
- 一个女菜鸟程序员的奋起
- 115个Java面试题和答案
- 黑马程序员学习笔记 Java中多线程与并发的总结
- 黑马程序员学习笔记 Java在win7中环境变量的配置
- 黑马程序员学习日记 Java中的垃圾回收机制
- 黑马程序员—java基础总结2
- 黑马程序员—java基础总结1
- 黑马程序员—Java面向对象程序设计
- 黑马程序员—继承
- 黑马程序员学习日记 overload与override的区别
- 工作面试经历
- 黑马程序员学习日记 Java基础知识精华
- 面试题28:字符串的排列
- 概率---面试题
- 面试题24:二叉搜索树的后序遍历序列
- 黑马程序员-java基础-常用的类以及它的方法
- 黑马程序员-java基础-集合
- 黑马程序员---泛型,Collections,Arrays