返回一个二维整数数组中最大子数组的和

题目:

· 返回一个二维整数数组中最大子数组的和。

要求:

· 输入一个二维整形数组,数组里有正数也有负数。

· 二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和。

· 求所有子数组的和的最大值。要求时间复杂度为O(n)。 

· 结对编程要求:

· 两人结对完成编程任务。

· 一人主要负责程序分析,代码编程。

· 一人负责代码复审和代码测试计划。

· 发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)。(截止到周四4月9日24:00)

 

设计思路:

     1.将数组按照如下方式分组:

    

   

   

   

     将选中部分的同一列相加,合并为一行,转化为一维数组。

     2.根据上一篇的一维数组求最大子数组的方法,求出二维数组的最大子数组。

     3.标记取得最大值时,子数组左上角和右下角元素的行和列的坐标,表示出最大子数组的元素组成。

 

 源代码

import java.util.Random;

import java.util.Scanner;

 

public class zuidashuzu3 {

public static void main(String[] args) {

 

//产生随机数组

int array[][] = new int[1000][1000];

int arraytemp[] = new int [1000];

int row,col,sum,sumTemp;

int t,m;

int qx=0,qy=0;

int zx=0,zy=0;//分别记录子数列的起始和结束位置

for(int i=0;i<1000;i++)

arraytemp[i]=0;

System.out.print("请分别输入数组的行数和列数:");

Scanner sc=new Scanner(System.in);

row = sc.nextInt();

col = sc.nextInt();

Random r = new Random();

System.out.println("产生的随机数序列为:     ");

for(int i=0;i<row;i++){

for(int j=0;j<col;j++){

array[i][j]=r.nextInt()%10;

System.out.print(array[i][j]+"   ");

if(j == col-1)

System.out.println("");

}

}

 

//求最大子数组

sum=array[0][0];

sumTemp=sum;

for(int i=0; i<row;i++){

for(int x=0;x<1000;x++)

arraytemp[x]=0;

for(t=i;t>=0;t--){

      for(int s=0;s<col;s++){

    if(t>=0){

    arraytemp[s]+=array[t][s];

    //qx=t;

    //qy=s;

    //System.out.println("&"+qx+" "+qy);

    //System.out.println("%"+arraytemp[s]+"%");

}

}

      sumTemp=arraytemp[0];

      m=0;

for(int j=0;j<col;j++){//按列消元

if(sumTemp<=0){

sumTemp=0;

m=j+1;

//qx=t;

//qy=j;

//System.out.println("&1 "+qx+" "+qy);

}

//System.out.println("#"+sumTemp+"#");

//System.out.println("*"+arraytemp[j+1]+"*");

sumTemp+=arraytemp[j+1];

if(sumTemp>sum){

sum=sumTemp;

qx=t;

qy=m;

zx=i;

zy=j+1;

    //System.out.println("@"+qx+" "+qy);

    //System.out.println("%"+zx+" "+zy);

}

}   

}

}

System.out.println("最大子数组的和为:"+sum);

System.out.println("子数组为:");

for(int i=qx;i<=zx;i++)

for(int j=qy;j<=zy;j++){

System.out.print(array[i][j]+" ");

if(j==zy)

System.out.println("");

}

}

}

 

运行结果

         

结组成员

 

 编程中遇到的问题

       1.循环层次出现混乱,出现问题是因为没有理清思路,或是对算法工作的思路虽然知道但是不是特别熟悉。

       2.选出子数组的坐标的过程中,注意元素命名时不要重复,注意元素是局部变量还是全局变量,有需要时可以将变量设为全局变量。

合作过程

      两人共同整理思路,提出解决方案,又否定解决方案,在否定与改正的过程中,曲折向上的发展完善我们的代码。其中也不乏矛盾与冲突,或许自己的想法同伴不理解,或是自己的思路有缺陷,自己却当事者这迷,固执自己的想法。其实,只要端正心态,相互信任,虚心学习,积极交流,用队友的优势弥补自己的不足,同时学会向队友推销自己的思路编程也是一个快乐的过程。不要把自己的消极情绪带到组合中。

 

posted @ 2015-04-02 22:36  巴蒂青葱  阅读(245)  评论(0编辑  收藏  举报