014-演算法面試必備-最大子陣列之和
阿新 • • 發佈:2018-12-17
最大子陣列之和
這是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; } }