1.题目
要求:
要求程序必须能处理1000 个元素;
每个元素是int32 类型的;
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
2.设计思想。
分别计算出所有子数组的和,进行比较,找出最大子数组。
3.代码。
#include<iostream> #include<stdlib.h> using namespace std; #include <ctime> #include <cstdlib> #define MAX 100000 int main() { int k,t=0,o=0; int n=0,m=0; int b[MAX]; int a[MAX]; cout<<"请输入数组中整数的个数:"<<endl; cin>>k; srand(time(0)); for(int i=0;i<k;i++) { a[i]=rand()%100-50; cout<<a[i]<<" "; // cin>>a[i]; } for(int l=1;l<k+1;l++) { for(i=0;i<k-l+1;i++) { for(int j=i;j<i+l;j++) { if(j>k-1) { break; } else m=m+a[j]; } b[n]=m; m=0; n=n+1; } } int max=b[0]; for(i=1;i<n;i++) { if(max<b[i]) max=b[i]; } /* for(i=0;i<n;i++) { if(max==b[i]) { m=i; } } m=m+1; int r=k; for(int j=0;j<k;j++) { if(m>=r&&r>=0) { m=m-r; t=t+1; r=r-1; } if(m==0&&r>0&&j!=k-1) { m=m+r+1; break; } if(m==0&&r==0&&t==k) { m=m+1; break; } }*/ cout<<endl; cout<<"该数组中的最大子数组的和为:"<<max<<endl; /*cout<<"这些数字为:"; m=m-1; if(t==0) { t=1; } for(i=m;i<m+t;i++) { cout<<a[i]<<" "; } for(i=0;i<n;i++) cout<<b[i]<<" ";*/ return 0; }
4.截图。
该图为查找1000个数中的最大子数组
数组中最大能存入10位数,超过10位数,系统就会自动舍弃后面的部分,而且,不会报错。
5.体会。
编程时一定要注意内存空间,不要超出最大内存,也不要超出数组的上限,这样会使系统出问题,但是程序不会报错。这样会使程序有很大的安全隐患。
6.照片。