您的位置:首页 > 其它

课堂练习----一个整数数组中最大子数组的和(2)

2016-03-26 15:11 295 查看
题目:

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

要求:

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

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

如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大。

同时返回最大子数组的位置。 求所有子数组的和的最大值。

设计思想:

这个题目是在上个题目的基础的加上数组首位相连,并该数组最大子数组的和,实现方法就是把环变成直线的方法,通过for循环,在每次循环中,把数组中的元素作为数组的起始位置,并把后面的元素依次放到另外一个数组中。对于新生成的数组,通过上一次的方法求出新数组的最大子数组的和,然后通过比较所有数组的最大子数组和,求出初始数组最大子数组的和。

2 4 7 -10

4 7 -10 2

7 -10 2 4

-10 2 4 7

代码:

#include<iostream>
using namespace std;
#define N 100
int main()
{
int p,num,value,max,count=0;
int val
;                                      //原始数组
int Array
;                                      //存放新生成的数组
int ArrayMax
;                                   //存放每个数组最大值
int ArrayFisrtLast

;                          //存放最大子数组的每个元素
int ArrayNum

;                               //存放最大子数组元素的个数
cout<<"输入数的个数:";
cin>>num;
for(int i=0;i<num;i++)                             //输入元素
{
cin>>val[i];
}
for(int i=0;i<num;i++)
{
int firstNum=0,lastNum=0,q=0;                   //最大子数组开始位置(firstNum),结束的位置(lastNum)
value=0;
p=i;
for(int k=0;k<num;k++)                           //重新开辟一个新数组Array,存放以原始数组的每个元素开头的数组
{
p=p%num;
Array[k]=val[p];
p++;
}
max=0;
for(int j=0;j<num;j++)                              //找出最大子数组
{
value=value+Array[j];
if(value>max)                                      //累加和大于max,累加和赋值给max
{
max=value;
lastNum=j;
}
if(value<0)                                // 当前和小于0,重置为0
{
value=0;
firstNum=j+1;
}
}
if(max<0)                                 // 最大和依然为0,说明数组中所有元素都为负值
{
max=val[0];
firstNum=0;
lastNum=0;
for(int j=0;j<num;j++)
{
if(max<Array[j])
{
max=val[j];
firstNum=j;
lastNum=j;
}
}
}
ArrayMax[count]=max;
for(int m=firstNum;m<=lastNum;m++)
{
ArrayFisrtLast[count][q]= Array[m];
q++;
}
ArrayNum[count][0]=lastNum-firstNum+1;
count++;
}
max=ArrayMax[0];
int n=0;
for(int i=0;i<count;i++)
{
if(max<ArrayMax[i])
{
max=ArrayMax[i];
n=i;
}
}
cout<<"最大子数组是:";
for(int i=0;i<ArrayNum
[0];i++)
{
cout<<ArrayFisrtLast
[i]<<" ";
}

cout<<endl;
cout<<"最大子数组的和为:";
cout<<max<<endl;
return 0;
}


截图:





总结:更加熟悉了数据结构与算法的学习,认为这门课程是非常重要的基础,要好好学习多加练习,更加熟悉两个人的结对开发,一起讨论,一起想解决方案,一起网上查找算法,更加锻炼了结对开发的能力。

项目计划总结:

日期&&任务听课编写程序阅读相关书籍网上查找资料日总计
周一100252515165
周二30352590
周三601535110
周四100303025185
周五18015195
周六601575
周日1515
周总计200325180130835
时间记录日志

日期开始时间结束时间中断时间净时间活动备注
3/2114:0015:5010100听课软件工程上课
17:1017:2010阅读书籍《构建之法》《梦断代码》
21:0021:2520网上查找资料
3/2214:0015:0010110结对编程编写老师布置的作业
16:0017:0010110看书《构建之法》《梦断代码》
3/2321:0021:3030结对编程编写老师布置的作业
3/2414:0015:5010100听课软件工程上课
3/2516:0018:00120结对编程编写老师布置的作业
3/269:009:3030看书《构建之法》《梦断代码》
3/279:009:3030看书《构建之法》《梦断代码》
缺陷记录日志:

  

日期编号类型引入阶段排除阶段修复时间修复缺陷
3月22日1编码编码0.2min
缺少头文件
2编码运行3min
重复使用变量i,导致无限运行
3月25日3编码编译1min
if条件中用了“=”运算符
4编码编译1min
缺少;
5编码编译0.2min
for的结尾再次使用i++,导致i加了两次



小组成员:杨超群 http://www.cnblogs.com/linumy/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: