题目:返回一个整数数组中最大子数组的和。
要求:
1.输入一个整形数组,数组里有正数也有负数。
2.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
3.如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],……A[n-1],A[0]……A[j-1]之和最大。
4.同时返回最大子数组的位置。
5.求所有子数组的和的最大值。
设计思想:一维循环数组求最大子数组可以简化成一维不循环数组求最大子数组 。
简化过程:将循环数组由某个位置剪开,展开成一维不循环数组。
源代码:
1 #include<iostream> 2 #include<stdlib.h> 3 #include<time.h> 4 using namespace std; 5 int main() 6 { 7 int i,j,n,b,p,sum,maxsum; 8 int *a; 9 cout<<"请输入数组的长度:"<<endl; 10 cin>>n;//数组的长度 11 cout<<"数组元素的最大取值:"<<endl; 12 cin>>p; 13 //如果为循环数组是以下操作 14 a=new int[2*n-1]; 15 srand(time(NULL)); 16 cout<<"生成数组元素"<<endl; 17 for(i=0;i<n;i++) 18 { 19 a[i]=rand()%(2*p+1)-p ; 20 cout<<a[i]<<' ';//循环数组的生成为: 21 if(i<n-1) 22 { 23 a[n+i]=a[i]; 24 } 25 26 } 27 cout<<endl; 28 maxsum=sum=0; 29 for(i=0;i<n;i++)//因为要将每个位置剪开展成的一维数组进行遍历比较需要两层循环 30 { 31 b=i;//每次剪开展开后的第一个数组元素的下标 32 for(j=0;j<n;j++) 33 { 34 sum+=a[b++]; 35 if(sum<0) 36 { 37 sum=0; 38 } 39 if(sum>maxsum) 40 { 41 maxsum=sum; 42 } 43 } 44 sum=0;//将每次展开的sum值归零 45 } 46 if(maxsum==0)//数组元素全为非负数时的处理 47 { 48 maxsum=a[0]; 49 for(i=0;i<n;i++) 50 { 51 if(maxsum<a[i]) 52 { 53 maxsum=a[i]; 54 } 55 } 56 } 57 cout<<"最大子数组的和为:"<<maxsum<<endl; 58 system("pause"); 59 return 0; 60 61 }
运行截图:
总结体会:最开始时没有考虑到每次遍历展开子数组和sum的归零,试了几次含有正数时和都会出错,检查后发现问题,改正了。
学习到了化繁为简的编程思想。
合作美图:
(20163953 关甜欢 20163955 王美仪)