1. 程式人生 > >014-演算法面試必備-最大子陣列之和

014-演算法面試必備-最大子陣列之和

最大子陣列之和

這是leetcode53題

我在找實習過程中,在快手遇到過這個問題,當時面試官要求10分鐘寫出來這個程式碼。我總共用了5分鐘就寫出來,原因很簡單,我見過這個題,然後面試官就告訴我通過了技術面試。另外在找工作的時候,我同學在上清所也遇到過這個問題,當然他也準備了。

描述:

/**

 * Maximum SubArray

 * 一個有n個元素的陣列,這n個元素,可以是正數也可以是負數,

 * 陣列中連續的一個或者多個元素可以組成一個連續的子陣列,

 * 一個數組可能有多個這種連續的

 * 子陣列,求子陣列和的最大值。

 * 請注意這個資料是連續的

 */

/**

解題:

 * 動態規劃的思想:

 * f(n)以arr[n]為結尾的子陣列和的最大值

 * f(n) = Math.max(f(n-1)+arr[n],arr[n])

 * f(n) = Math.max(f(n),f(n-1))

注意:

尤其注意這裡連續的概念

可以思考為什麼下面這個等式為什麼不行?

f(n) =Math.max( Math.max(f(n-1)+arr[n],arr[n]),f(n-1));

下面的程式碼使用動態規劃和動態規劃的簡化版本

以及使用錯誤的方式來做,為什麼錯誤的方式會出錯??

class Solution_MaxSubArray1009{
	public int getMax(int[] arr){
        int n = arr.length;
        int nEnd = arr[0];
        int nAll = arr[0];
        for(int i = 1;i<n;i++){
            nEnd = Math.max(arr[i],nEnd+arr[i]);
            nAll = Math.max(nEnd,nAll);
        }
        return nAll;
	}
	public int getMaxDy(int[] arr){
		int n = arr.length;
		int[] memo = new int[n];
		memo[0] = arr[0];
		int maxValue = arr[0];
		for(int i=1;i<n;i++){
			memo[i] = Math.max(memo[i-1]+arr[i],arr[i]);
			maxValue = Math.max(maxValue,memo[i]);
		}
		return maxValue;
	}
	//為什麼這個答案是錯得???連續
	public int getMaxWrong(int[] arr){
		int n = arr.length;
		int[] memo = new int[n];
		memo[0] = arr[0];
		int maxValue = arr[0];
		for(int i=1;i<n;i++){
			memo[i] = Math.max(Math.max(memo[i-1]+arr[i],arr[i]),memo[i-1]);
			maxValue = Math.max(maxValue,memo[i]);
		}
		return maxValue;
	}
}