Leecode 53. 最大子序和

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

示例 1:

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

示例 2:

输入:nums = [1]
输出:1

示例 3:

输入:nums = [0]
输出:0

示例 4:

输入:nums = [-1]
输出:-1

 对于面试题目,一般面试官希望看到的结果都不是暴力法,哪怕是一个dfs剪枝,也要比暴力法好。

这道题目应该使用动态规划来求解,让我们再来分析一下这个问题。

在这个问题中,我们发现,如果我们从前向后遍历数组,一个子数组的下一个元素是正数,那么加入这个元素一定是更好的方案。

如果小于零,那么加入这个元素后的子数组一定不如之前的子数组,之前的子数组就是一个局部最优解。

在整个过程中,我们去比较局部最优解中的最大值,就可以得到最优的子数组。

 

 

class Solution {
    public int maxSubArray(int[] nums) {
        // dp[i] 表示以nums[i]结尾的最大和
        int[] dp = new int[nums.length];
        dp[0] = nums[0];
        int res = dp[0];
        for (int i = 1; i <nums.length ; i++) {
            dp[i] = dp[i-1]>0 ? dp[i-1]+nums[i] : nums[i];
            res = Math.max(res,dp[i]);
        }
        return res;

    }
}

 


posted @ 2021-04-12 17:00  kpwong  阅读(42)  评论(0编辑  收藏  举报