标签:
一、题目及要求
题目:返回一个整数数组中最大子数组的和。
要求: 输入一个整型数组,数组里有正数也有负数;
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和;
求所有子数组的和的最大值。要求时间复杂度为O(n);
二、设计思路
程序分成两个部分:
先从数组中第一个数开始算起,一直求到与它连续的的所有数的和存入数组son,然后从第二个数开始算起,求与它连续的数的和存入数组,以此类推,直至计算到最后一个数。有n个数据的数组能产生的子数组个数为n*(n+1)/2
三、源代码
1 // ketang4.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include "iostream" 6 using namespace std; 7 8 9 /*确定求和存储数组元素*/ 10 void Son(int father[],int son[],int length) 11 { 12 int add; //定义求和变量 13 int count=0; //统计数组元素个数 14 for(int i=0;i<length;i++) 15 { 16 add=0; 17 for(int j=0;j<length-i;j++) 18 { 19 add=add+father[i+j]; 20 son[count+j]=add; 21 } 22 count=count+length-i; 23 } 24 } 25 26 /*找到最大的子数组的和*/ 27 void Max(int son[],int num) 28 { 29 int max=son[0]; 30 for(int i=0;i<num;i++) 31 { 32 if(max<son[i]) 33 { 34 max=son[i]; 35 } 36 } 37 cout<<max<<endl; 38 } 39 40 /*主函数*/ 41 int main() 42 { 43 int length,num; //定义原始数组长度length,求和存储数组长度num 44 cout<<"请输入数组元素个数:"; 45 cin>>length; 46 int* father=new int[length]; //定义原始数组 47 num=length*(length+1)/2; 48 int* son=new int[num]; //定义求和存储数组 49 cout<<"请输入原始数组数据:"<<endl; 50 for(int i=0;i<length;i++) 51 { 52 cin>>father[i]; 53 } 54 Son(father,son,length); 55 cout<<"最大子数组的和为:"; 56 Max(son,num); 57 return 0; 58 }
四、实验结果
五、实验分析
这可以算的上是第一次结队开发了吧,以前真的没有几个人在一块讨论实现问题,虽然以前也有过分组的实验之类的课程作业,但是,最多刚开始讨论一下,之后不了了之了,所有东西都是自己在做,自己想到什么是什么,不会顾及别人的想法。在我和梁世豪一起做这道题的时候,对这道题有不同的想法,但是经过思考,决定选取上面这种解法,虽然没有实现复杂度为o(n),但还是达到了两个人预期的结果。虽然这个程序很短,但是两个人在完成过程中,有交流和分析,可以知道对方的想法思路,可以拓宽自己的思维,取得1+1>2的效果。
标签:
原文地址:http://www.cnblogs.com/zhshto/p/4349069.html