当前位置: 首页 > article >正文

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 <= nums[i] <= 104

思路

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

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

下面放出我的代码,因为最近感觉对于C++的语法捡起来差不多了,于是之后的解题会用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;
    }
}

http://www.kler.cn/a/467155.html

相关文章:

  • 125个Docker的常用命令
  • 利用webworker解决性能瓶颈案例
  • 【MySQL】九、表的内外连接
  • Python深度学习GRU、LSTM 、BiLSTM-CNN神经网络空气质量指数AQI时间序列预测及机器学习分析|数据分享...
  • QT-窗口嵌入外部exe
  • Spring Cloud Security集成JWT 快速入门Demo
  • 什么是护网行动?
  • spring cloud微服务分布式架构
  • vllm源码(一)
  • jQuery Mobile 可折叠块
  • 51单片机——LED模块
  • NS4863 500mA 锂电池充放电管理IC
  • LeetCode算法题——有序数组的平方
  • UGUI 优化DrawCall操作记录(基于Unity2021.3.18)
  • 049_小驰私房菜_MTK Camera debug,通过adb 命令读写Camera sensor寄存器地址的值
  • iOS 中performBatchUpdates 的机制
  • Day2 -- QingLuoPay基础功能搭建
  • window11 wsl mysql8 错误分析:1698 - Access denied for user ‘root‘@‘kong.mshome.net‘
  • vue3 ui组件子组件封装v-model绑定props modelValue
  • 使用SSH建立内网穿透,能够访问内网的web服务器
  • 使用Docker部署最新版JupyterHub
  • 如何利用群晖NAS实现远程访问你的网页版Linux虚拟桌面环境
  • [gcc]代码演示-O使用场景
  • SQL中聚类后字段数据串联字符串方法研究
  • kernel32.dll动态链接库报错要怎解决?详细解析kernel32.dll文件缺失解决方案
  • 什么是 C++ 的序列化?