最大子数组和(每日一题-中等)
动态规划解法:
动态规划通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。
对于本题来说,原问题是求解有最大和的连续子数组。
定义一个动态规划列表dp,dp[i]表示以元素nums[i]为结尾的连续子数组的最大和。
定义dp[i]的含义的时候,要求必须包含元素nums[i],这是因为,如果不包含这个元素的话,在由dp[i]推导dp[i+1]的时候不满足连续子数组的要求,就不连续了。
转移方程:
初始值::dp[0]=nums[0]
原问题的答案就是:dp数组中的最大值。
状态压缩:
还可以不用定义新数组,因为dp[i]只和dp[i-1]与nums[i]有关,因此可以把原数组nums当作dp数组,不用定义新数组。
class Solution {public int maxSubArray(int[] nums) {int res=nums[0];for(int i=1;i<nums.length;i++){nums[i]+=Math.max(nums[i-1],0);res=Math.max(res,nums[i]);}return res;}
}
上述代码中的res是用来保存答案的,dp数组直接用nums数组来表示的。