课堂实践01

        这周四老师给我们讲了很多东西,告诉我们今后如何更好的工作学习。现在苦一点以后轻松一点。教学计划等也了解了大概。后两节课老师给我们布置了一道编程题如下:

      题目:返回一个整数数组中最大子数组的和。 要求: 输入一个整形数组,数组里有正数也有负数。        数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大       值。要  求时间复杂度为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);
    }
}
原文地址:https://www.cnblogs.com/Excusezuo/p/10500238.html