關於返回一個整數數組中最大子數組的和的問題
阿新 • • 發佈:2019-03-10
時間 方式 ble i++ 比較 port inf += pac
題目:返回一個整數數組中最大子數組的和
要求:1、輸入一個整形數組,數組裏有正數也有負數。
2、數組中連續的一個或多個整數組成一個子數組,每個子數組都有一個和。
3、求所有子數組的和的最大值。要求時間復雜度為O(n)
方法一:剛拿到這個題目時,先沒有考慮時間復雜度的問題,就是想把所有的子數組的和算出來,然後在比較,思路簡單,但循環次數多
package about_bank_account; import java.util.Scanner; public class Test { public static void main(String[] args) { Scanner in= new Scanner(System.in); int[] A = new int[5];//大數組 int[] B = new int[15]; int temp = 0; int i; int k;//k為行 int t1 = 0;//小數組內循環 int t2 = 0;//記錄小數組內數字個數 int sum = 0;//和 int j = 0; int max = 0; System.out.println("輸入5個數:"); for(i = 0;i < 5;i++) { temp = in.nextInt(); A[i] = temp; } for(k = 0;k < 15;k++) { for(t1 = j;t1 <= t2;t1++) { sum = sum + A[t1]; } t2++; B[k] = sum; sum = 0; if(t2 == 5) { j = j + 1; t2 = j; } } max = B[0]; for(k = 0;k < 15;k++) { if(max < B[k]) { max = B[k]; } } System.out.print("-------------"+max); } }
方法二:先將數組轉化成一正一負(正負相間)的數組,
若原數組為:
5 | -1 | -2 | 1 | 2 |
轉化後數組為:
5 | -3 | 3 |
然後在轉化後的數組的基礎上,從第一個數開始,依次加兩個數然後比較,加到最後一位數後,再從第二個數開始加,這樣循環,找出其中最大數
(本方法我沒有具體實現,轉化後數組第一個數字正負不同,加的方式不同)
方法三:把數組的第一個值付給rmax和max,隨後進行循環比較,從正值開始計數,如果一個一個累加起來小於等於零,就將max重新賦值,每次把最大值付給rmax,最後得出子數組的和的最大值。
package about_bank_account; import java.util.Scanner; public class Test { public static void main (String[] args){ @SuppressWarnings("resource") Scanner in=new Scanner(System.in); int num[]=new int[5]; int max=0; int rmax=0; System.out.println("請輸入五個數:"); for(int i=0;i<5;i++) { num[i]=in.nextInt(); } rmax=num[0]; for(int i=0;i<5;i++) { if(max<=0) { max=num[i]; }else { max+=num[i]; } if(rmax<max) { rmax=max; } } System.out.println(rmax); } }
關於返回一個整數數組中最大子數組的和的問題