题目:输入一个整型数组,数组里有正数也有负数。数组中一个或者连续的多个整数组成一个字数组。求所有字数组的和的最大值。要求时间复杂度为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);