?
石家莊鐵道大學 信1405-1 班 唐炳輝
?
題目:給定一個整數數組,找到一個具有最小和的子數組。返回其最小和。
?
?
設計思路:兩個變量 ,一個記錄當前并入的數組的值,另外一個記錄所算過得最大的數組的值,當并入的值為小于零的時候,就沒必要進行繼續的相加了,因為再加也不可能比后邊單獨的數字大,所以,為負數就重新刷新位置,重置子數組的長度重新去找一個新的子數組
?
1 //石家莊鐵道大學 信1405-1 班 唐炳輝:三藏 2 /**給定一個數組,求出這個數組中子數組的最大值,求出,要求時間復雜度為O(n)**/ 3 package java_ketang; 4 import java.util.Scanner; 5 6 7 8 public class MinArray { 9 10 11 12 public static void main(String[] args) { 13 MinArray f = new MinArray(); 14 15 //用戶自己定義數組的長度并 自行輸入一串數組 16 17 Scanner in=new Scanner(System.in); 18 System.out.print("請輸入數組長度:"); 19 int flase0g=in.nextInt(); 20 //輸入數組中的各個數值 21 System.out.print("請依次輸入整數:"); 22 int Arr[]=new int[flase0g]; 23 for(int i=0;i<flase0g;i++) 24 { 25 Arr[i]=in.nextInt(); 26 } 27 //輸出用戶輸入的數組 28 System.out.print("您輸入的數組為 "); 29 for(int i=0;i<flase0g;i++) 30 { 31 System.out.print(Arr[i]+" ") ; 32 } 33 34 //輸出最后的結果 35 f.findMaxArr(Arr); 36 } 37 38 public void findMaxArr(int[] arr) { 39 int Arr = 0;//用來記錄當前并入的數組的和 40 int MaxArr = 0;//用來記錄之前的最大的數組和 41 int A = arr.length; 42 int Location1=0; 43 int Location2=0;//用來記錄子數組的最后一個位置 44 45 int i; 46 47 48 /**核心算法,兩個變量 ,一個記錄當前并入的數組的值,另外一個記錄所算過得最大的數組的值 49 當并入的值為小于零的時候,就沒必要進行繼續的相加了,因為再加也不可能比后邊單獨 50 的數字大,所以,為負數就重新刷新位置,重置子數組的長度重新去找一個新的子數組**/ 51 for ( i = 0; i < A; i++) { 52 Arr += arr[i]; 53 if (Arr < 0) { 54 Arr = 0; 55 56 57 } 58 if (Arr > MaxArr) { 59 MaxArr = Arr; 60 Location2=i; 61 ; 62 } 63 } 64 65 //用這個算法,通過最后的位置,和最大值來求出起始位置 66 for(i=Location2;i>=0;i--) 67 { 68 if(MaxArr-arr[i]==0) 69 { 70 Location1=i;//通過求出來的最大值和最后的那個位置,往前推移,找出起始位置 71 break;//跳出循環 72 } 73 74 } 75 /**這種情況的出現當且僅當全部的數字都為負數的時候, 76 對所有的數字求一個最大值就是最大子數組**/ 77 if (MaxArr == 0) { 78 for ( i = 0; i < A; i++) { 79 if (i == 0) { 80 MaxArr = arr[i]; 81 } 82 if (arr[i] > MaxArr) { 83 MaxArr = arr[i]; 84 } 85 } 86 } 87 //*************** 88 System.out.println("子數組的長度為"+(Location2-Location1+1)); 89 System.out.println("子數組是由第 "+(Location1+1)+" 個數到第 "+(Location2+1)+" 個數組成"); 90 System.out.println("最大子數組的和是 "+MaxArr); 91 92 } 93 }
驗證截圖