面試題31:連續子陣列的最大和(java)
阿新 • • 發佈:2019-01-25
陣列的最大子序列問題:給定一個數組,其中元素有正,也有負,找出其中一個連續子序列,使和最大。
方案1:這個問題可以動態規劃的思想解決。設b[i]表示以第i個元素a[i]結尾的最大子序列,那麼顯然b[i+1]=b[i]>0?b[i]+a[i+1]:a[i+1]。基於這一點可以很快用程式碼實現。最大子矩陣問題:給定一個矩陣(二維陣列),其中資料有大有小,請找一個子矩陣,使得子矩陣的和最大,並輸出這個和。
package findMax; /** * 連續子陣列的最大和 * 設b[i]表示以第i個元素a[i]結尾的最大子序列, * 那麼顯然b[i+1]=b[i]>0?b[i]+a[i+1]:a[i+1]。 * 基於這一點可以很快用程式碼實現。最大子矩陣問題:給定一個矩陣(二維陣列),其中資料有大有小,請找一個子矩陣,使得子矩陣的和最大,並輸出這個和。 * @author root * */ public class FindMax { static int[] data = {1,-2,3,10,-4,7,2,-5}; public static void main(String[] args) { // TODO Auto-generated method stub find1(); } //分析資料規律,記錄並輸出連續子陣列的下標 public static void find1(){ //記錄位置 int begin = 0, end = 0, c_begin = 0; //最大值 int max = 0; //到i為止的值 int temp = 0; for(int i=0; i<data.length; i++){ temp+=data[i]; if(temp>max){ max=temp; begin = c_begin; end = i; } if(temp<0){ temp = 0; c_begin = i+1; } } System.out.println("begin:"+begin+" end:"+end); System.out.println("max:"+max); } //分析資料規律 public static void find(){ int max = 0; int temp = 0; for(int i=0; i<data.length; i++){ temp+=data[i]; if(temp>max){ max = temp; } if(temp<0){ temp = 0; } } System.out.println(max); } //動態規劃求解 public static void findDongtai(){ } }