题目:输入一个整型数组,数组里有正数也有负数。数组中一个或者连续的多个整数组成一个字数组。求所有字数组的和的最大值。要求时间复杂度为O(n)。
首先,分析题干,我们会发现难点有两个,一个是存在正负数,一个是时间复杂度。
第一个难点很容易解决,很多人会卡在时间复杂度上。
接受老师的建议,我先将时间复杂度为O(n^2)写了出来,因为太过简单,不在此贴出代码。
接着,我开始思考,时间复杂度为O(n),那么注定只等遍历一次。
以此为核心,那么可以假设我要一次性的便利过程中,不能停止的累加,需要解决的问题是,如何判断负数是否要加的问题,因为很难判断加上负数后,再加上整数就一定会比原来大。
在这个方面思考了很长时间后,我发现很难解决,那么改变思路。
我为什么要判断是否要加负数,我直接一口气从头加到尾,取累加过程中的最大值不就可以了吗(累加过程中要考虑累加值为负数的情况。)
于是乎,写出如下代码
int array[] = {-1,2-3,4,5,6,-6,7,8};
int num= array[0];
int max = 0;
for(int i=0; i<4; i++){
if(max >= 0) {
max += array[i];
}
else{
max = array[i];
}
if(max >num){
num= max;
}
}
System.out.println(max);