1.题目
输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和18。
2.实现思路
Step1.从头到尾逐个累加数组中的每个数字,首先加上第一个数字,从第二个数字开始累加,依次将累加和保存到一个临时变量(nCurrSum)中;
Step2.如果当前累加和(curSum)小于0,那抛弃前面的子数组和,从下一个数字开始重新累加;
Step3.将当前累加和(curSum)与返回累加和(maxNum)进行比较,如果curSum>maxNum,则更新maxNum。
3.代码实现
public class FindGreatestSumOfSubArray {
public int findGreatestSumOfSubArray(int [] array){
if(array==null||array.length==0){
return 0;
}
int curSum=array[0];
int maxSum=array[0];
for(int i=0;i<array.length;i++){
if(curSum>0){
curSum+=array[i];
}else{
curSum=array[i];
}
if(maxSum<curSum){
maxSum=curSum;
}
}
return maxSum;
}
@Test
public void test(){
int [] array={1,-2,3,10,-4,7,2,-5};
int result=findGreatestSumOfSubArray(array);
System.out.println(result);
}
}