动态规划之最大子序和

示例:

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

解析:利用动态规划思想。假设i-1的最大子序和已经求出为dp[i-1],那么如果dp[i-1]小于0,第i个为结尾的最大子序和不如不加,因为前面i-1最大子序加出来都是负的,直接将nums[i]作为dp[i]。如果dp[i-1]大于0,那么证明前面的子序和不小,可以跟着一起做更大的。最大子序和要每次都和更新了的maxSum比大小。

代码:

class Solution {
    public int maxSubArray(int[] nums) {
        int[] dp = new int[nums.length];
        dp[0] = nums[0];
        int maxSum = 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];//状态转移方程
            }
            maxSum = Math.max(maxSum,dp[i]);
        }
        return maxSum;
    }
}
全部评论

相关推荐

老树开花:可以开始投了,不用等到觉得完全准备好。一边投一边根据面试反馈改简历是最高效的方式。简历上项目描述建议突出你解决的具体问题,比如编辑器的性能优化、大文档渲染怎么处理的,而不只是列技术栈。中厂前端实习现在竞争确实激烈,建议同时关注一些有AI业务的团队,前端加AI应用是很有差异化的组合。Vue全家桶基础扎实的话可以往SSR或者跨端方向延伸,这些是面试加分项。加油,时间还来得及。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务