题目:返回一个二维整数数组中最大子数组的和
要求: n输入一个二维整形数组,数组里有正数也有负数。
n二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和。
n求所有子数组的和的最大值。要求时间复杂度为O(n)。
组员:陈晨( 负责程序分析,代码编程),王颖瑞( 负责代码复审和代码测试计划)
思路:二维数组求最大子数组是从一维数组扩展而来,首先确定了最大上界的情况下在第一行开始确定最大子数组范围,对于规定好的最大子数组的范围,把最大子数组按照一列有几个数,分成几种不同的行,对于以上产生的几个数组,进行一维数组求子数组之和最大值的方法。依次求出最大值,依次比较,保留最大的。是最大上界下降重复以上步骤。
对于求二维数组的子数组之和,思路和求一维数组的相差不多,但需要分析更多的情况,我跟舍友讨论之后,之后写的。以下是我的思路:
1.确定子数组的最大上界,从第一行依次向下,规定最大子数组的范围。
2.对于规定好的最大子数组的范围,把最大子数组按照一列有几个数,分成几种不同的行。(如第一组只有一行,第二组有两行等,列数和数组的列数相同)
3.对于第二步产生的几个数组,进行一维数组求子数组之和最大值的方法。依次求出最大值,依次比较,保留最大的
4.使最大上界下降1,重新第2 、3、4步。
代码:
#include<iostream> using namespace std; void main () { int x,y,i,j,m=0,A[100][100]; cout<<"输入矩阵的行()和列"; cin>>x>>y; if(x>100||y>100) { cout<<"请重新输入:"; cin>>x>>y; } for(i=0;i<x;i++) { for(j=0;j<y;j++) { cin>>A[i][j]; } } int sum[100]={0},max=0,result=A[0][0]; for(i=0;i<x;i++)//确定子数组的最大上界(为第i行) { while(m+i<x)//确定子数组有m+i行 { //把子数组当成一位数组一样,求最大子数组的和 for(j=0;j<y;j++) { sum[j]=sum[j]+A[m+i][j]; } max=0; for(j=0;j<y;j++) { if(max+sum[j]>sum[j]) { max=max+sum[j]; } else { max=sum[j]; } if(max>result) { result=max; } } m++;//是子数组的行数+1 } //初始化m和sum[]的值,使子数组最大上界下降1,之后重新循环。 m=0; for(j=0;j<y;j++) { sum[j]=0; } } cout<<result; }
截图:
测试:
针对此次的程序主要进行了以下测试:
1.全负:输出矩阵中最大的负数
2.仅有1个值:输出本身
3.全为0:输出0
4.仅有一行或一列:输出正常
5.超出数组范围:重新输入(代码限制)
总结:二维数组求最大子数组是从一维数组扩展而来,一维数组可用线性解决,对于二位数组本来的想法是以O(n)的时间复杂度实现可经过自己查阅资料和同学讨论还是没有想出解决方案,最后只能把结果做出为目标制定了如上的思路,本次的任务依然是结对开发在这次的的开发过程中我和陈晨同学分工明确也渐渐找到了结对开发的一些注意的事项,在工作中也会有不同的的看法比如在讨论制定思路方面,我们面对意见不同时我们各自告诉对方自己的看法在分析谁的想法比较好这样也解决了问题,结对开发中收获了很多。
工作照: