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;
    }
}
相关推荐
To_OC20 分钟前
LC 994 腐烂的橘子:人人都说是 BFS 入门题,我却写了三遍才过
javascript·算法·leetcode
金銀銅鐵4 小时前
[Python] 扩展欧几里得算法
python·数学·算法
To_OC6 小时前
LC 200 岛屿数量:经典 DFS 入门题,我第一次写居然连方向都搞错了
javascript·算法·leetcode
To_OC1 天前
LC 128 最长连续序列:别上来就排序,O (n) 解法才是这题的灵魂
javascript·算法·leetcode
05Kevin2 天前
lk每日冒险题--数据结构6.27
算法
To_OC2 天前
从一次栈溢出报错说起,我把递归彻底扒明白了
javascript·算法·程序员
千纸鹤安安2 天前
千问Qwen-AgentWorld来了:一个语言模型搞定七大Agent场景,GPT-5.4都输了
算法
七牛开发者2 天前
MCP 到底是什么?为什么 Agent 都想接上它
算法·aigc·agent