LeetCode-53. 最大子序和
給定一個整數數組 nums ,找到一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。
示例:
輸入: [-2,1,-3,4,-1,2,1,-5,4],
輸出: 6
解釋: 連續子數組 [4,-1,2,1] 的和最大,爲 6。
思路
使用動態規劃求解。
首先將要求解的大集合分解成一個個小集合。如果我們知道每個以nums數組中當前元素結尾的子段的最大序列和,那麼再對所有以這些元素結尾的最大序列和取max即可。
那麼以nums【i】的結尾的最大子序列和怎麼求呢?需要注意的是數組中的元素是整數,有正有負。
當上一個狀態加上nums【i】的時候,不一定是以nums【i】的結尾的最大子序列和。這裏仍要nums【i】自身與取max。
狀態轉移方程:f[i] = max(f[i-1]+nums[i]),nums[i])。
class Solution {
public int maxSubArray(int[] nums) {
int res=Integer.MIN_VALUE;//記錄最大子序和
int pre=0;//f[i-1]
for(int i=0;i<nums.length;i++)
{
int cur=Math.max(pre+nums[i],nums[i]);
res=Math.max(cur,res);
pre=cur;
}
return res;
}
}