这周四老师给我们讲了很多东西,告诉我们今后如何更好的工作学习。现在苦一点以后轻松一点。教学计划等也了解了大概。后两节课老师给我们布置了一道编程题如下:
题目:返回一个整数数组中最大子数组的和。 要求: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大 值。要 求时间复杂度为O(n)。
看到题目之后就开始提炼其中的关键字:整形数组,可正可负,一个或者多个子数组求和,获取和的最大值并输出和,时间复杂度是O(n).
思路当然就是按部就班的创建数组,然后一次次的遍历整个数组,找到最大的那个输出。但是创建数组之后如何遍历所有数组让我思索了很久。用for循环一个个算出来并赋值给max,再判断当前输出的值是不是比上次的大,取最大值。思索了一会明确了思路,却不知道怎么编下去,总感觉有很多漏洞,逻辑还是有些问题,就不断的调试不断实验,一直没解决。
过了一会,老师让做完的同学上台分享他们的思想方法,我的思路才慢慢清晰,矛盾的地方也渐渐明了。最后,参考了一个同学的方法,修补着自己的不足,创建数组,赋值,循环取极大值输出,将极大值输出比较,如果全是负数将最大的直接输出,全是正数就相加比较。茅塞顿开,编译成功。
源代码如下:
package project; import java.util.Scanner; public class dfsfa { public static void main(String[] args){ int number,sum,a; int i; Scanner in = new Scanner(System.in); System.out.println("请输入数组的大小:"); number=in.nextInt(); int array[]=new int[number]; System.out.println("请输入数组的值:"); for(i=0;i<number;i++) { array[i]=in.nextInt(); } sum=array[0]; a=array[0]; for(i=1;i<number;i++) { if(a<0) { a=0; } a+=array[i]; if(a>sum) sum=a; } System.out.println(sum); } }