【leetcode】【53】Maximum Subarray
阿新 • • 發佈:2019-02-12
一、問題描述
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [−2,1,−3,4,−1,2,1,−5,4]
,
the contiguous subarray [4,−1,2,1]
has the largest sum = 6
.
If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.
二、問題分析
最大最長連續子序列,非常經典的dynamic programing問題。需要明確的是狀態轉移方程中的狀態代表的含義。因為contiguous,所以dp[i]代表的應該以i位置元素結尾的連續值,並非最大值。
三、Java AC程式碼
因為很多中間狀態是沒用的,因此可以用變數代表狀態,因此還可以優化。public int maxSubArray(int[] nums) { int[] dp = new int[nums.length]; int max = nums[0]; dp[0] = nums[0]; for(int i=1;i<nums.length;i++){ if (dp[i-1]<0) { dp[i] = nums[i]; }else { dp[i] = dp[i-1]+nums[i]; } max = Math.max(max, dp[i]); } return max; }
public int maxSubArray(int[] nums) { int maxSoFar = Integer.MIN_VALUE; int maxEndingHere = 0; for(int i=0;i<nums.length;i++) { if (maxEndingHere<0) { maxEndingHere = 0; } maxEndingHere += nums[i]; maxSoFar = Math.max(maxSoFar, maxEndingHere); } return maxSoFar; }