二维数组求最大子数组改进(一)
设计思路:
由于最初写的那个求二维数组的最大子数组的方法是对于每个元素进行遍历,使其构成一个矩形块,把那个对每一个块进行求和最后比较,虽然能够求出结果但是时间耗费较大,就对其进行了改进。本次改进是结合了一维数组求最大子数组的方法,将二维数组能够挨在一块的行进行相加,使其构成一个一维数组,这样就可以调用一维数组求和的方法,对其求最大子数组,然后就进行比较就可以了,这样就可以减少一些循环过程了。
1 package test; 2 /* 3 * 求二位数组的最大子数组 4 */ 5 import java.util.Scanner; 6 7 public class Shuzu2 { 8 static Scanner in = new Scanner(System.in); 9 10 11 public static void main(String[] args) { 12 // TODO 自动生成的方法存根 13 14 int row; // 行 15 int clo; //列 16 int a[] = new int [100]; //定义一个一维数组 17 int[][] b = new int[20][20]; //存放输入的二维数组 18 int value = 0; 19 System.out.println("输入数组的行数和列数"); 20 row = in.nextInt(); 21 clo = in.nextInt(); 22 23 System.out.println("输入数组元素"); 24 for(int i = 0; i < row; i++) 25 { 26 for(int j = 0; j < clo; j++) 27 { 28 29 b[i][j] = in.nextInt(); 30 } 31 } 32 33 int max = 0; 34 35 for(int i = 0 ; i < clo ; i++) 36 { 37 a[i] = b[0][i]; 38 } 39 max = maxsum(a); // 对max附初值为第一行的最大子数组 40 41 for(int i1 = 0 ; i1 < row-1 ; i1++) 42 { 43 for(int j1 = 0 ; j1 < clo; j1++) // 每一次对一维数组附初值为开始第一行的值 44 { 45 a[j1] = b[i1][j1]; 46 } 47 48 for(int j2 = i1+1 ; j2 < row ; j2++) 49 { 50 for(int t = 0; t < clo ; t++) 51 { 52 a[t] = a[t] + b[j2][t]; // 从第j2行开始一直加到最后一行构成一个一维数组 53 54 } 55 value = maxsum(a); //调用方法求一维数组的最大子数组 56 if (value > max) { 57 max = value; 58 } 59 } 60 } 61 62 for(int i = 0 ; i < clo ; i++) // 计算最后一行的自大子数组 63 { 64 a[i] = b[row-1][i]; 65 } 66 value = maxsum(a); // 求最后一行的最大子数组 67 68 if (value > max) { 69 max = value; 70 } 71 72 73 System.out.println("最大子数组为" + max); 74 } 75 76 //求一维数组的最大子数组 77 public static int maxsum(int a[]) 78 { 79 int sum = a[0]; 80 int value = 0; 81 for(int i = 0; i < a.length; i++) 82 { 83 if (value <= 0) { 84 value = a[i]; //当用于记录的值小于等于0时就无需对其进行相加了,此时就等于下一个值 85 }else { 86 value += a[i]; //当value的值仍大于0时就继续相加 87 } 88 if (sum < value) { //用sum等于子数组的最大值,若value的值大于sum的值,则将value赋值给sum 89 sum = value; 90 } 91 } 92 93 return sum; 94 } 95 96 }
实验结果截图: