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;
    }
}
相关推荐
南境十里·墨染春水2 小时前
讲讲移动语义
算法
西凉的悲伤3 小时前
Guava类库——Range连续区间
java·算法·guava
菜菜的顾清寒3 小时前
力扣HOT(100)54多维动态规划-最长公共子序列
算法·leetcode·动态规划
随意起个昵称3 小时前
线性dp-LIS题目3(合唱队形)
算法
小六学编程3 小时前
二分查找详解:从普通二分到左右边界
算法·c/c++
wayz113 小时前
Volume:PVO(百分比成交量震荡指标)技术指标详解
算法·金融·数据分析·量化交易·特征工程
毕竟是shy哥3 小时前
PromptHash:基于亲和提示协同学习的自适应哈希检索跨模态算法
学习·算法·哈希算法
甄心爱学习3 小时前
【项目实训(个人12)】
人工智能·python·算法
团象科技3 小时前
走访近百支出海技术团队后的海外云计算资源选型实操观察
大数据·人工智能·算法
勤自省3 小时前
吴恩达机器学习课程实验:线性回归模型入门(课后实验)
人工智能·算法·机器学习·回归·线性回归