设计思路:随机取数,然后以一个定点开始遍历求出它的所有的子数组,比较大小,如果比首先定义的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的六次方。