求数列中最大子数组的和

1.练习题目

题目:返回一个整数数组中最大子数组的和。

要求:

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

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

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

结对编程要求:

两人结对完成编程任务。

一人主要负责程序分析,代码编程。

一人负责代码复审和代码测试计划。

发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)。(截止到周日3月24日24:00)

 

2.设计思想

基本思想1

在和最大的子数列的两端肯定没有负数,负数只可能存在于子数列的中间部分,所以若数列的两端是负数,则将其舍弃不计入子数列。

基本思想2

整体法思想,即,将子数列左端第一个数和左端第二个数的和看作一个数,可以进行消元化简。

基本思想3

 最大值思想,初始时将数列左端第一个数作为默认最大值,对数列第一个数进行判断,若该数是负数,运用思想1若为正数运用思想2从左到右依次进行,运用思想2是将每次求得的和与最大值比较,若比最大值大,则更新最大值。

这样即可得到最大值,然后只要为取得最大值时的子数列的设置开始和结束的标志,可以得到子数列的序列。

 

3.程序源代码

import java.util.Random;

import java.util.Scanner;

 

 

public class zudazishuzu {

/**

 * @param args

 */

public static void main(String[] args) {

// TODO 自动生成的方法存根

int shz[]=new int[100];

int temp1=0,temp2=0,flag1=0,flag2=0;//分别记录子数列的起始和结束位置

int sum,te;//表示子数列的和

Random r=new Random();

System.out.print("请输入数组元素的个数: ");

Scanner sc=new Scanner(System.in);

int a=sc.nextInt();

System.out.println("--------------------------------" +

"------------------------------------------");

System.out.print("产生的随机数序列为:     ");

for(int i=0;i<a;i++){

shz[i]=r.nextInt()%10;

System.out.print(shz[i]+"   ");

}

System.out.println("");

sum=shz[0];

te=sum;

for(int i=0;i<a;i++){

if(te<=0){

te=0;

temp1=i+1;

temp2=i;

}

te+=shz[i+1];

temp2++;

if(te>sum){

sum=te;

flag1=temp1;

flag2=temp2;

}

}

System.out.print("子数组的组成元素为:    ");

for(int i=flag1;i<=flag2;i++)

System.out.print(shz[i]+"    ");

System.out.println('\n'+"子数组和的最大值为:    "+sum);

}

}

 

 

4.运行结果

 

 

5.编程总结

①将整个的程序分而治之,是解决问题的方法。

②理清思路很重要,明确编程时每一步要做什么,功能是什么。

③做好代码的注释工作,便于理解和检查。

④注意编程时代码的规范编写。

⑤编程时不应只是用用已经掌握的知识,要到网上多查阅相关内容,扩展知识面,增加知识储备。

⑥做好常见形式算法的整理,并熟练运用,锻炼自己的专业能力,温习数据结构中的常见算法。

⑦运用新知,熟悉PSP项目计划日志、时间记录日志、缺陷记录日志等方面的内容。

 

6.项目计划日志

 

姓名:张欢龙        班级:信1305         日期:2015/3/22

日期

任务

听课

编写程序

阅读课本

运动

 

日总计

周五

90

0

10

60

 

160

周六

0

0

10

0

 

10

周日

0

180

10

0

 

190

总计

90

180

30

60

 

360

 

 

7.时间记录日志

 

学生:张欢龙                       日期:2015/3/20

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

日期

开始时间

结束时间

中断时间

净时间

活动

备注

C

U

3/20

1500

1800

60

120

写作业

 

 

 

3/21

 

 

 

 

娱乐

 

 

 

3/22

1100

1400

60

120

编程

吃午饭

 

 

 

1600

1700

 

60

编程

 

 

 

 

8.缺陷记录日志

 

学生:  张欢龙

日期:  2015/3/22

教员:  王建民

程序号:1

日期

编号

类型

引入阶段

排除阶段

修复时间

修复缺陷

3/22

1

逻辑错误

设计

编译

10min

 

 

描述:不能求出子数列的最大值

 

2

习惯问题

编码

检查

5min

 

 

描述:更改不规范的常量和变量的命名

posted @ 2015-03-22 20:02  巴蒂青葱  阅读(830)  评论(1编辑  收藏  举报