设计思路:随机取数,然后以一个定点开始遍历求出它的所有的子数组,比较大小,如果比首先定义的max大 ,则替换,如果小,则继续比较。
代码:
package 二维数组最大子数组和;
import java.util.Random;
import java.util.Scanner;
public class Two {
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.print("请输入数组的长度:");
Scanner sr=new Scanner(System.in);
int num=sr.nextInt();
int [][]arry=new int[num][num]; //创建数组
Random a =new Random(num); //随机取数
for(int i=0;i<num;i++)
{
for(int j=0;j<num;j++)
{
arry[i][j]=a.nextInt(200)-100;
System.out.print(arry[i][j]+" ");
}
System.out.println();
}
System.out.println();
int sum=0,max=arry[0][0],arryL=0,arryR=0,posL=0,posR=0;
for(int i=0;i<num;i++)
{
for(int j=0;j<num;j++)
{
for(int i1=i;i1<num;i1++)
{
for(int j1=j;j1<num;j1++)
{
for(int i2=i;i2<=i1;i2++)
{
for(int j2=j;j2<=j1;j2++)
{
sum=sum+arry[i2][j2];
}
}
if(sum>=max)
{
max = sum;
arryL = i;
arryR = j;
posL = i1;
posR = j1;
}
sum=0;
}
}
}
}
System.out.println("最大子数组和为:");
System.out.println(max);
System.out.println("最大子数组为:");
for(int i = arryL;i <= posL;i++)
for(int j = arryR;j <= posR;j++)
{
System.out.print(arry[i][j] + " ");
if(j == posR)
{
System.out.print("
");
}
}
}
}
实验截图:
反思:刚开始编这个程序的时候没有思路,想用以前那个一维数组的算法,可是感觉没有那么简单,没有成功,所以用了一个最笨的办法,以一个点开始遍历。虽然这个方法易懂,好求最大子数组的位置,但时间复杂度比较高,为n的六次方。