LeetCode:53. 最大子数组和

简介

题目链接:https://leetcode.cn/problems/maximum-subarray/description/

解决方式:数组 + 动态规划

这是作者学习众多大神的思路进行解题的步骤,很推荐大家解题的时候去看看题解里面大佬们的思路、想法!

推荐查看liweiwei1419大佬所作题解。

动态规划

解题思路:动态规划解题有三个部分:状态定义、状态转移方程式、初始值与边界。至于如何进行状态的定义,需要每一位读者去感悟、发现,因为题目的要求是不一样的,没有固定的模版。

非空间最优

java 复制代码
class Solution {
    public int maxSubArray(int[] nums) {
        int len = nums.length;
        // 状态定义(子问题/小问题)
        // 以当前元素为结尾的所有连续数组的最大值
        // 此定义下的连续数组只有两个,分别是前面所有元素加上当前元素(q)以及仅包含当前元素(w)
        int[] dp = new int[len];
        // 初始值与边界
        dp[0] = nums[0];
        // 最大值
        int max = nums[0];
        // 状态转移方程
        // 从小到大,从下到上的计算
        for(int i = 1; i < len; i++){
            if(dp[i-1] > 0){
                // 前面元素和大于 0,那么当前这个 q 数组最大值就是前面元素和 + 当前元素
                dp[i] = dp[i-1] + nums[i];
            }else{
                // 否则,连续数组最大值就是 w 数组
                dp[i] = nums[i];
            }
            // 比对当前连续数组是否是最大值
            max = Math.max(max, dp[i]);
        }
        // 返回数据
        return max;
    }
}

空间优化

值得注意的是,空间优化后的可读性十分不好。

java 复制代码
class Solution {
    public int maxSubArray(int[] nums) {
        // 状态的定义
        // 当前元素为结尾的连续数组的最大值
        int dp = 0;
        // 最大的值
        int max = nums[0];
        // 迭代
        for(int num : nums){
            // 状态转移方程式
            dp = Math.max(dp + num, num);
            // 获取连续数组的最大值
            max = Math.max(dp, max);
        }
        // 返回最大值
        return max;
    }
}
相关推荐
企客宝CRM18 小时前
2026年中小企业CRM选型指南:企客宝CRM处于什么位置?
android·算法·企业微信·rxjava·crm
橙淮18 小时前
二叉树核心概念与Java实现详解
数据结构·算法
米罗篮18 小时前
DSU并查集 & 拓展欧几里得-逆元
c++·经验分享·笔记·算法·青少年编程
橙淮18 小时前
双指针法:高效算法解题的利器
算法
初心未改HD18 小时前
深度学习之MLP与反向传播算法详解
人工智能·深度学习·算法
刀法如飞18 小时前
【Go 字符串查找的 20 种实现方式,用不同思路解决问题】
人工智能·算法·go
程序员雷欧20 小时前
大厂OS面试高频题
面试·职场和发展
技术小黑20 小时前
CNN算法实战系列03 | DenseNet121算法实战与解析
pytorch·深度学习·算法·cnn
wearegogog12321 小时前
三电平SVPWM逆变器仿真指南
单片机·算法