1. 程式人生 > >二維數組求最大子數組改進(一)

二維數組求最大子數組改進(一)

lse 圖片 等於 相加 div 分享圖片 賦值 過程 import

設計思路:

由於最初寫的那個求二維數組的最大子數組的方法是對於每個元素進行遍歷,使其構成一個矩形塊,把那個對每一個塊進行求和最後比較,雖然能夠求出結果但是時間耗費較大,就對其進行了改進。本次改進是結合了一維數組求最大子數組的方法,將二維數組能夠挨在一塊的行進行相加,使其構成一個一維數組,這樣就可以調用一維數組求和的方法,對其求最大子數組,然後就進行比較就可以了,這樣就可以減少一些循環過程了。

 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 }

實驗結果截圖:

技術分享圖片

二維數組求最大子數組改進(一)