数组

1. 题目:

   输入一个整形数组,数组里有正数也有负数。

   数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

   求所有子数组的和的最大值。要求时间复杂度为O(n)。

2. 设计思想

   这个程序乍一看特别简单,一个新手都会,但仔细一想,才发现其中的难度。空间复杂度为O(n),这个就比较难了。、

   首先产生N个随机数,下面就是核心部分,

   我的想法是用for循环,但是根据题目要求只能用一次循环,想了很久才发现,可以进行一次次判定,我把我的思想分成来两部分:

        1. 在这个循环中,把前几个相加,看是否是整数。

        2. 其次看(i+1)的和是否大于(i)的和。

   根据这就可以用一个循环来进行计算。接下来就是考虑其他的问题,比如最大子数组的起始位置和最终位置。把这个加入到for循环中,用if条件语句进行判断。最后输出即可。

3. 源代码

import java.util.Random;
import java.util.Scanner;


public class main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int a[]=new int[100];
        int sum,d,temp1=0,temp2=0,flag1=0,flag2=0;  //分别记录子数列的起始和结束位置
        System.out.print("请输入数组元素的个数:(小于100) ");
        Scanner sc=new Scanner(System.in);
        int m=sc.nextInt();
        Random rand = new Random();
        for(int i=0;i<m;i++)//循环为数组赋值
        {
            a[i] = rand.nextInt(40)-20;
            System.out.print(a[i]+" ");
        }
        sum=a[0];
        d=sum;
        for(int i=0;i<m;i++)//核心循环,来判断怎么产生最大子数组
        {
            if(d<=0){
                d=0;
                temp1=i+1;
                temp2=i;
            }        
            d+=a[i+1];
            temp2++;
            if(d>sum){
                sum=d;
                flag1=temp1;
                flag2=temp2;
            }
        }
        System.out.println("");
        System.out.print("子数组的组成元素为:    ");
        for(int i=flag1;i<=flag2;i++)
            System.out.print(a[i]+" ");
        System.out.println("");
        System.out.println("子数组和的最大值为:    "+sum);

    }

}

4. 运行结果截图

5. 周活动总结表

                                                                                                     周活动总结表

                                                        姓名:张晨建                                                                    日期:2015-03-23

 

听课

编写程序

阅读课本

日总计

周日

70

30

100

周一

240

20

260

周二

500

500

周三

120

60

180

周四

360

40

400

周五

360

20

380

周六

120

80

60

260

周总计

1900

210

170

2280

                                                         阶段时间和效率                                            周数(上一周活动总结的周数+1):1

                                                         不包括在上一周内的累计时间

总计

 1700

 100

 20

 1820

平均

 1700

 100

 20

 1820

最大

 1700

 100

 20

 1820

最小

 1700

 100

 20

 1820

                                                        以前各周的累计时间

总计

 1700

 100

 20

 1820

平均

 1700

 100

 20

 1820

最大

 1700

 100

 20

 1820

最小

 1700

 100

 20

1820

 6. 时间记录日志:

                                                  学生:张晨建                                                                                 日期:3/23/2015

                                                  教师:王建民                                                                                 课程:软件工程概论

 日期

开始时间 

结束时间 

中断时间 

净时间 

活动 

 备注

 3-20

 10:10

 12:00

10 

100 

 上课

 软件时间概论

 3-20----3-21

 剩余时间上课和休息

 3-22

 9;00

 11:30

 0

 150

 编程

 3-23

 4:00

 7:00

 0

 180

 编程

 

7. 缺陷记录日志

                                                 学生:张晨建                                                                                日期:3/23/2015

                                                 教师: 王建民                                                                                         程序:数组

日期

编号

修复时间

修复缺陷

描述

3-22

1

20

产生随机负数

修复了无法产生随机负数的bug

3-23

2

120

求最大数组

修复了求最大子数组一直出现全部的bug

 
原文地址:https://www.cnblogs.com/zchenjian/p/4361102.html