结对开发_返回二维整数数组中最大子数组的和。

解题思路:

  由于基础过差,基础知识掌握的不够牢靠,这道题对我个人来说有很大的难度。

  其实把我的小伙伴也难倒了。

  我本来的想法是:从二维数组的左上角开始,从上到下从左到右,依次遍历,求出成员只有一个,两个,三个,四个的子数组和,每求出一个来,就和上一个比较大小,保留最大值。

  奈何技术水平有限,很难用代码实现。

  我和我的小伙伴只好求助于互联网。

  课上有同学讲了先把行相加合成一位数组再进行处理,所以受到启发那也可以先把各列压缩,换成一维数组再进行处理,但由于能力以及精力的不足,未能按时完成任务。

  以下为参考的别人的代码(该代码来自cqs_2012的博客)

// 求出二维数组的最大子二维数组
    int Array::Max_Sum_Sub_Double_Array(int **data,const unsigned int row,const unsigned int column)
    {
    // 异常输入
        if(data == NULL || row == 0 || column == 0)
        {
            cout<<"异常输入 Max_Max_Sub_Double_Array"<<endl; mycolumn="" ||="" 0="" column="=" row="=" null="" if(data="=" 异常输入="" {="" e)="" int="" s,unsigned="" mycolumn,unsigned="" column,unsigned="" unsigned="" row,const="" data,const="" **="" array::sum_sub_column_double_array(int="" 求出二维数组中的某一列的子数组的和="" }="" max_sum_sub_array(onearray,row);="" return="" "<<r<<endl;="" "<<l<<"="" "<<d<<"="" cout<<u<<"="" border_max_sum_sub_array(onearray,row,u,d);="" u,d;="" onearray[i-1]="Sum_Sub_Column_Double_Array(data,row,column,i,1,row);" <="column;i++" i="1;i" for(unsigned="" int[row];="" onearray="new" 按照一位数组来处理行,把每一行作为一个数="" onearray;="" []="" delete="" border_max_sum_sub_array(onearray,column,l,r);="" l,r;="" )="" for(="" int[column];="" *="" 按照一位数组来处理列,把每一列作为一个数="" 核心算法数据初始化="" else="" 正常输入="" -1;=""> column || s>e || e>row)
        {
            cout<<"异常输入 Sum_Sub_Column_Double_Array"<<endl; ||="" 0="" column="=" row="=" null="" if(data="=" 异常输入="" {="" e)="" int="" s,unsigned="" column,unsigned="" unsigned="" row,const="" }="" return="" <="e;i++)" i="s;i" for(unsigned="" else="" 正常输入="" -1;="" myrow="" myrow,unsigned="" **data,const="" array::sum_sub_row_double_array(int="" 求出二维数组中的某一行的子数组的和="" sum;="" +="data[i-1][mycolumn-1];" sum="0;"> row || s>e || e> column)
        {
            cout<<"异常输入 Sum_Sub_Row_Double_Array"<<endl; ||="" 0="" null="" if(data="=" 异常输入="" {="" int="" unsigned="" }="" return="" <="e;i++)" i="s;i" for(unsigned="" )="" for(="" else="" 正常输入="" sum;="" +="data[myrow-1][i-1];" sum="0;" data[i]="" if(="" length;i++="" 检查是否所有的数是否都是负数,并记录最大值的下表="" max="0;" ;="" all_fushu="true" bool="" void(0);="" border_max_sum_sub_array"<<endl;="" cout<<"异常输入="" length="=" r)="" &="" l,unsigned="" length,unsigned="" const="" *data,unsigned="" array::border_max_sum_sub_array(int="" void="" 求数组的子数组之和最大的边界="" else{="">= 0 )
                {
                    all_fushu = false ;
                    break ;
                }
                else if( data[i] > data[max] )
                {
                    max = i ;
                }
            }
 
        // 如果都是负数
            if(all_fushu == true)
            {
                R = L = max+1;
                return void(0);
            }
 
            // 如果不都是负数
            else
            {
            // 核心算法 初始化
                int left_sum = data[0],right_sum = data[length-1] ;
                int left = 0,right =length-1;
                L = left; R = right ;
 
            // 选择前进方向
                while(left < right-1)
                {
                    if(left_sum < right_sum)
                    {
                        if(left_sum < 0)
                        {
                            left_sum = 0 ;
                            L = left+1 ;
                        }
                        left++;
                        left_sum += data[left];
                    }
                    else
                    {
                        if(right_sum < 0)
                        {
                            right_sum = 0;
                            R = right -1;
                        }
                        right--;
                        right_sum += data[right];
                    }
                }
 
            // 寻求结果
 
            // 如果舍弃左半个数组,保留右半个数组
                if(left_sum <= 0)
                {
                    L = right + 1;
                    R++ ;
                }
 
            // 如果舍弃右半个数组,保留左半个数组
                else if(right_sum <= 0){
                    L++;
                    R = left+1;
                }
 
            // 两边都不舍弃
                else{
                    L++;R++;
                }
 
                return void(0);
            }   
        }
    }
</endl;></endl;></endl;>

  实验感想: 

  通过本次实验,我深刻的认识到了自己的不足,拖累了队友。

  所以在此提醒后来者,一定要打好基础,才能做到游刃有余。同时也敦促自己,一定要加强练习,提高自己的技术水平,来面对一个又一个的难题。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。