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;
    }
}
相关推荐
地平线开发者6 小时前
【模型轻量化专题】衡量模型轻量性的指标
算法
学习星球9 小时前
OFDM技术精讲:正交性推导、循环前缀原理与80行Python链路仿真(附实测数据)
算法·面试·前端框架
alphaTao15 小时前
LeetCode 每日一题 2026/8/24-2026/8/30
python·算法·leetcode
Interview Aid11216 小时前
TikTok OA 四题分享|半小时内 AC,题目基本都是实现题
java·开发语言·算法·面试·职场和发展
顶点多余1 天前
那些在算法中适合巩固的知识点---1
java·前端·算法
罗西的思考1 天前
【Agentic RL / 强化学习框架】Molt 设计解读
人工智能·算法·机器学习
hahaha60161 天前
HLS高层次综合设计技巧--C++类和模板
图像处理·人工智能·算法·计算机视觉
多弗朗皮卡丘1 天前
算法详解4:买卖股票的最佳时机系列(上)
算法
维克兜率天1 天前
【维克】动量指标家族:RSI、ROC、CCI、Momentum全面解析
python·算法
AI情绪识别开源1 天前
检信 AI 智能推广平台(代号:JX-Promote)
人工智能·算法·erlang