求数列中最大子数组的和
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 |
15:00 |
18:00 |
60 |
120 |
写作业 |
|
|
|
3/21 |
|
|
|
|
娱乐 |
|
|
|
3/22 |
11:00 |
14:00 |
60 |
120 |
编程 |
吃午饭 |
|
|
|
16:00 |
17:00 |
|
60 |
编程 |
|
|
|
8.缺陷记录日志
学生: 张欢龙
日期: 2015/3/22
教员: 王建民
程序号:1
日期 |
编号 |
类型 |
引入阶段 |
排除阶段 |
修复时间 |
修复缺陷 |
3/22 |
1 |
逻辑错误 |
设计 |
编译 |
10min |
|
|
描述:不能求出子数列的最大值 |
|||||
|
2 |
习惯问题 |
编码 |
检查 |
5min |
|
|
描述:更改不规范的常量和变量的命名 |