1. 程式人生 > >面試題31:連續子陣列的最大和(java)

面試題31:連續子陣列的最大和(java)

陣列的最大子序列問題:給定一個數組,其中元素有正,也有負,找出其中一個連續子序列,使和最大。
方案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(){
		
	}
}