标签:
题目:
· 返回一个二维整数数组中最大子数组的和。
要求:
· 输入一个二维整形数组,数组里有正数也有负数。
· 二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和。
· 求所有子数组的和的最大值。要求时间复杂度为O(n)。
· 结对编程要求:
· 两人结对完成编程任务。
· 一人主要负责程序分析,代码编程。
· 一人负责代码复审和代码测试计划。
· 发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)。(截止到周四4月9日24:00)
设计思路:
1.将数组按照如下方式分组:
2.按照分组,将二维数组转化为一维数组
源代码
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("");
}
}
}
标签:
原文地址:http://www.cnblogs.com/bdqczhl/p/4413469.html