一.题目:
返回一个整数数组中最大子数组的和。
要求:
1.输入一个整形数组,数组里有正数也有负数。
2.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
3.求所有子数组的和的最大值。要求时间复杂度为O(n)。
二.设计思路
1.数组num[]长度已确定是N,将数组中字数组的和放到数组sum[]中
2.sum[0]=num[0],sum[1]=num[0]+num[1],sum[2]=num[0]+num[1]+num[2]……
sum[N]=num[1],sum[N+1]=num[1]+num[2]……如此循环,直至所有自己的和全部存进 数组sum中。
3.然后求出数组sum中的最大值,再输出结果。
三.源代码
// 求和.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include"iostream.h" #define SIZE 5 //数组的个数 #define MAXSIZE 100 //子集个数的最大值 void CaculateSum(int sum[],int length,int num[])//计算数组中各个子集的和 { int j=0; for(int i=0;i<SIZE;i++) { for(int k=i;k<SIZE;k++) { if(i==k) { sum[j]+=num[k]; } else { sum[j]=sum[j-1]+num[k]; } j++; } } } //求所有情况的个数 int GetAcc() { int acc=0; for(int i=1;i<=SIZE;i++) { acc+=i; } return acc; } //找出数组中的最大值,length是b[]中的个数 int GetMax(int b[],int length) { int max=b[0]; for(int i=0;i<length;i++) { if(max<b[i]) { max=b[i]; } } return max; } int main() { int num[SIZE],sum[MAXSIZE],max=0,acc; int count[2]={0,0}; //num[num]是要求的整数count[2]中是负数和正数的个数 cout<<"请输入"<<SIZE<<"个整数:"; for(int i=0;i<SIZE;i++) //计算数组中正数和负数的个数 { cin>>num[i]; if(num[i]<0) count[0]++; //负数的个数 else count[1]++; //正数 } acc=GetAcc(); for(i=0;i<acc;i++) { sum[i]=0; } if(count[0]==0) //若全是正数的话 { for(int i=0;i<SIZE;i++) { max+=num[i]; } } else if((count[1]==0)||(count[0]==1)) //若全是负数或者有一个正数 { max=GetMax(num,SIZE); } else //其他情况 { CaculateSum(sum,acc,num); max=GetMax(sum,acc); } cout<<"最大子集的和是:"<<max<<endl; return 0; }
四.运行结果及截图
五.结对开发的感想
1.自己负责写代码,当自己写完交给队友之后,检查错误用的时间比较短,如果要是自己检查的话花的时间可能比较长,因为这是自己写的,当你检查的时候会不自觉的和当时编写代码的思想重合,可能就会漏掉一些逻辑上的错误。而自己的搭档则能客观的检查。
2.在调试遇到一些小问题的时候,因为我的搭档是个女生嘛,比较细心,所以解决问题比我自己一个人的时候快,效率高。
六.工作照