查找二维数组list[][]中的最大的子数组的和
之前做过最大一维数组子数组的和的题目,现在将数组扩展成二维:
代码如下:
#include<iostream> #define null -858993460 using namespace std; void main() { int arr[]={8,9,10,-1,20,-30,4}; int arr2[]={-9,-1,-4,-123}; int arr3[]={0}; int arr4[]={7,9,8}; int arr5[3]; int a[][100]={{5,6,-3,8,-9,2},{1,-12,20,0,-3,-5},{-9,-7,-3,6,7,-1}}; int b[2][100]; int c[3][100]={{-1,-2,-3},{-4,-5,-6},{-7,-8,-9}}; int yiwei_maxsub_list(int list[],int length); int erwei_maxsub_list(int list[][100],int x,int y); cout<<"一维数组:"<<endl; cout<<yiwei_maxsub_list(arr,7)<<endl; cout<<yiwei_maxsub_list(arr2,4)<<endl; cout<<yiwei_maxsub_list(arr3,1)<<endl; cout<<yiwei_maxsub_list(arr4,3)<<endl; cout<<yiwei_maxsub_list(arr5,0)<<endl; cout<<"二维数组:"<<endl; cout<<erwei_maxsub_list(a,3,6)<<endl; cout<<erwei_maxsub_list(b,0,0)<<endl; cout<<erwei_maxsub_list(c,3,3)<<endl; } int yiwei_maxsub_list(int list[],int length) { int a[100]={0}; int max; int i,j; int k=0; if(list==NULL||length==0) { cout<<"error!inter is null!"; return 0; } for(i=0;i<length;i++) { a[k]=list[i]; for(j=i;j<length;j++) { a[k+1]=a[k]+list[j+1]; k++; } } max=a[0]; for(i=0;i<k;i++) { if(max<a[i]) { max=a[i]; } } return max; } int erwei_maxsub_list(int list[][100],int x,int y) {//int list[][100]={{5,6,-3,8,-9,2},{1,-12,20,0,-3,-5},{-9,-7,-3,6,7,-1}};x=3,y=6 int a[100][100]={0}; int b[100][100]={0}; int max,i,j,n; int t,k;//t行扩展后的,k列扩展 if(list==NULL||x==0||y==0)//异常处理 { cout<<"error!inter is null!"; return 0; } for(n=0;n<x;n++)//n层(x) { k=0; for(i=0;i<y;i++) { a[n][k]=list[n][i]; for(j=i;j<y;j++) { a[n][k+1]=a[n][k]+list[n][j+1]; k++; } } } t=k; for(n=0;n<t;n++)//n列(t) { k=0; for(i=0;i<x;i++) { b[k][n]=a[i][n]; for(j=i;j<x;j++) { b[k+1][n]=b[k][n]+a[j+1][n]; k++; } } } max=list[0][0]; for(i=0;i<k;i++) { for(j=0;j<t;j++) if(max<b[i][j]) { max=b[i][j]; } } return max; }
截图:
时间:用时,在一维数组的前提下1小时;
方法:将二维数组参数传入函数后,函数将数组先进行行扩展,每行记录单独一行的子数组,然后列扩展,将原来的二维数组扩展为子数组和的数组,然后遍历扩展后的数组找到最大值;这样时间复杂度是(m+n)².
总结:这其实体现了敏捷开发中的问题,用户的需求不断改变,团队的效率建立在过去的基础上,迭代开发的效率会比较高。这也是现在软件开发的主流,需要团队合作,代码规范,程序结构完整,健壮性强等等。再今后的软件工程学习和运用中深入体会。