LeetCode -Hot100 - 53. 最大子数组和

前言

本专栏主要通过"LeetCode 热题100",来捡起自己本科阶段的算法知识与技巧。语言主要使用c++/java。如果同样正在练习LeetCode 热题100的朋友欢迎关注或订阅本专栏。有疑问欢迎留言交流~

题目描述

题目链接

示例 1:

输入:nums = -2,1,-3,4,-1,2,1,-5,4

输出:6

解释:连续子数组 4,-1,2,1 的和最大为 6 。

示例 2:

输入:nums = 1

输出:1

示例 3:

输入:nums = 5,4,-1,7,8

输出:23

提示:

1 <= nums.length <= 105

-104 <= numsi <= 104

思路

属于动态规划的例图,凭借着之前本科对于这题动态转移方程的记忆把代码写下来了。下面是官方的解法:我们用 f(i) 代表以第 i 个数结尾的「连续子数组的最大和」,那么很显然我们要求的答案就是:

max 0≤i≤n−1 {f(i)}

因此我们只需要求出每个位置的 f(i),然后返回 f 数组中的最大值即可。那么我们如何求 f(i) 呢?我们可以考虑 numsi 单独成为一段还是加入 f(i−1) 对应的那一段,这取决于 numsi 和 f(i−1)+numsi 的大小,我们希望获得一个比较大的,于是可以写出这样的动态规划转移方程:

f(i)=max{f(i−1)+numsi,numsi}

下面放出我的代码,因为最近感觉对于C++的语法捡起来差不多了,于是之后的解题会用Java多一点。

java 复制代码
class Solution {
    public int maxSubArray(int[] nums) {
        // 动态规划经典题,最大子数组和
        int nums_size = nums.length;
        // 最后一个数字为下标为i的之和
        int[] dp_nums = new int[nums_size];
        // init
        dp_nums[0] = nums[0];
        // 动态转移方程
        for (int i=1;i<nums_size;i++){
            if (dp_nums[i-1] > 0){
                dp_nums[i] = dp_nums[i-1] + nums[i];
            }
            else{
                dp_nums[i] = nums[i];
            }
        }
        //寻找最大值
        int maxSum = -9999999;
        for (int i=0;i<nums_size;i++){
            maxSum = Math.max(dp_nums[i], maxSum);
        }
        return maxSum;
    }
}
相关推荐
the3clipse6 小时前
H.265熵编码核心:CABAC自适应二进制算术编码详解——如何将语法元素高效压缩为比特流
人工智能·算法·视频编码·h.265·hevc·cabac·cavlc
CQU_JIAKE6 小时前
10.4【A】
算法
Godspeed Zhao6 小时前
现代智能雷达技术19——算法(5)
算法
(Charon)6 小时前
【C++面试】RAII到底是什么:从资源管理理解C++对象生命周期
c++·算法·面试
Omics Pro6 小时前
之江实验室NAR|虚拟细胞3阶段训练范式
数据库·人工智能·算法·机器学习·自然语言处理
Tisfy6 小时前
LeetCode 0678.有效的括号字符串:O(n)+O(1)一次遍历
算法·leetcode·字符串·题解·贪心·括号匹配
小O的算法实验室7 小时前
IEEE TEVC,学习辅助的搜索路径重构进化算法
学习·算法·重构
Liuchang09117 小时前
洛谷 P2670 [NOIP 2015 普及组] 扫雷游戏
c++·算法·游戏
言乐67 小时前
Python体现逻辑回归和决策树的区别
开发语言·python·算法·决策树·逻辑回归
HugoStudio_SWAN7 小时前
洛谷 B4575 [GESP202609 二级] 直角三角形——临场定义理解与边界质疑
c++·学习·程序人生·算法