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


    题目:

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

    要求:

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

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

    · 求所有子数组的和的最大值。要求时间复杂度为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.选出子数组的坐标的过程中,注意元素命名时不要重复,注意元素是局部变量还是全局变量,有需要时可以将变量设为全局变量。

    合作过程

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

     

  • 相关阅读:
    Asp.Net MVC 2 RC 2 发布
    SqlServer2008修改表时出现“save changes is not permitted…”解决方法
    使用LoadRunner测试WMS
    使用Expression Encoder 3发布媒体文件到WebDAV
    Net Remoting Error:试图创建未绑定类型的代理
    Net4.0VS2010新特性
    WCF的一些基本知识点
    WCF中的ServiceHost初始化两种方式
    WMS中添加默认发布点
    HTTP 错误 500.19 Internal Server Error 错误解决方法
  • 原文地址:https://www.cnblogs.com/bdqczhl/p/4388644.html
Copyright © 2020-2023  润新知