一、题目

输入一个整型数组,数组里有正数也有负数。数组中一个或者连续的多个整数组成一个字数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。

二、需求分析

1.输入整数数组
2.输出最大子数组的和
3.如何寻找最大子数组

 三、题目分析

 因为时间复杂度为O(n),则只能遍历一次数组。

这是一段“傻子”代码,我用这一段代码来思考这道题,或许有点迷惑,有的时候我也搞不懂,纯粹靠自己的想法制造。

int a[n],sum,max;
sum=max[a,b]
*a=a[1]+a[2]

for(int i=0;i<n;i++)
if(a[i]>=0)
sum=sum+a[i];
else
sum=sum;
 

 

四、程序源码

//这段代码不能说是出自我手,毕竟是参考了一个网上的教程后才能写出来的,最开始我是万万写不出来的,还需要加油。
package zhengxingshuzu;

public class Zxsz {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
      int array[] = {1,-6,3,-5,7,1,-9,5};
      System.out.println(findMax(array));
    }
    public static int findMax(int array[]){
        //加上约束条件,防止当数组为空时造成数组越界
        if (array.length == 0) {
            return 0;
        }
        int max = array[0];
        int sum = 0;
        for(int i=0; i<array.length; i++){
            //如果加上某个元素sum>=0的话,就加;
            if(sum >= 0) {
                sum += array[i];
            }
            //当数组全为负数的时候只要有加法就一定比原来的数小,此时就相当于找出数组内最大的数
            else{
                sum = array[i]; //否则从当前位置重新计算
            }
            if(sum > max){
                max = sum;
            }
        }
        return max;
    }
}

这个代码无法从控制板输入数组,只能从后台输入数组。

五、运行截图

例如数组{1,-6,3,-5,7,1,-9,5}

结果如下: