最大子序列和

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-subarray
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

这个问题还是一个动态规划问题,动态规划问题的第一步就是找到状态转移方程。
先设定dp[i]数组为存放最大子序和的数组,i为最大子序和的最后一个数组坐标。
要判断dp[i]是否为最大坐标,则要判定dp[i-1]是否是i-1个的最大子序和。
如果dp[i-1] < 0,则max = dp[i],否则dp[i] = dp[i-1] + nums[i]
以此类推,我们可以从第0个元素开始遍历nums[]数组,并比较每次遍历后的max值来获取最终的max值。

class Solution {
     
    public int maxSubArray(int[] nums) {
     
        if (nums.length == 0) return 0;
        if (nums.length == 1) return nums[0];
        int[] dp = new int[nums.length];
        dp[0] = nums[0];
        int max = dp[0];
        for (int i = 1; i < dp.length; i++) {
     
            if (dp[i - 1] > 0) {
     
                dp[i] = dp[i - 1] + nums[i];
            } else {
     
                dp[i] = nums[i];
            }

            max = Math.max(dp[i],max);
        }
        return max;
    }
}

参考文献:

【1】.鱼枕 https://zhuanlan.zhihu.com/p/49427827.

你可能感兴趣的:(个人学习,算法,动态规划,leetcode,java)