您的位置:首页 > 职场人生

面试题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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: