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;
    }
}
相关推荐
揽星河..4 分钟前
【C语言】分支和循环
c语言·c++·算法
Fuyo_11192 小时前
C++ AVL树保姆级详解:从平衡因子到四大旋转机制
java·c++·算法
jktantan2 小时前
每个节点 41 字节:把一棵百万节点树拆进 14 个 typed array
前端·javascript·vue.js·算法·typescript
揽星河..2 小时前
【C语言】猜数字游戏
c语言·算法·游戏
frjc3 小时前
分布式服务拆分实战指南:从底层逻辑到面试话术
微服务·面试·职场和发展
LabVIEW开发3 小时前
CTM-3 红外测温仪 + LabVIEW 温度怎么测?
算法·labview·测试·labview程序
纪念 2293 小时前
C++算法(六)
开发语言·c++·算法
Dumbness4 小时前
UIA 读微信群消息没有 id,怎么判断哪条是新的:后缀对齐在翻历史和撤回时整屏重报
python·算法
taka4 小时前
从 24x 到 141x:我用纯 Python 零依赖项目,扒开了 GPU 加速的性能黑洞
算法
UIU1145 小时前
P16237 [蓝桥杯 2026 省 B] 应急布线
数据结构·c++·算法·蓝桥杯