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