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

动态规划-53.最大子数组和-力扣(LeetCode)

一、题目解析

在给定顺序的数组中找出一段具有最大和的连续子数组,且大小最小为1.

二、算法原理

1.状态表示

 

我们可以意一一枚举出所有的子数组,但我们想要的是最大子数组,所以f[i]表示:以i位置为结尾,所有子数组的最大和

2.状态转移方程

 

f[i]当长度为1时,此时的子数组和为nums[i],当长度大于1时,此时的子数组和为[0,i-1]的子数组最大值加上nums[i],我们需要取二者中的最大值。

所以f[i]=max(nums[i],f[i-1]+nums[i]);

3.初始化

在计算f[i]中我们用到了f[i-1]当i处于0位置时,越界访问,所以我们可以直接初始化f[0],或者加一个虚拟格子用于初始化。

 

4.填表顺序

从左到右填表,保证所需值已计算

5.返回值

由于f[i]中存储的是到达i位置的最大子数组和,我们需要知道从[0,n-1] 区间内的最大值,所以返回值为f[i]中的最大值

思考与实践同等重要,在思考后可以去实现一下,链接:53. 最大子数组和 - 力扣(LeetCode)

 三、代码示例

class Solution {
public:int maxSubArray(vector<int>& nums) {int n = nums.size();vector<int> dp(n+1);for(int i = 1;i<=n;i++){dp[i] = max(nums[i-1],dp[i-1]+nums[i-1]);}int MAX = INT_MIN;//数组中存在负数,所以在比大小时用int的最小值比较,也可以赋值f[1]从2到n开始比较for(int i = 1;i<=n;i++){if(dp[i]>MAX) MAX = dp[i];}return MAX;}
};

 

看到最后,如果对您有所帮助请点赞、收藏和关注, 点点关注不迷路,我们下期再见!

相关文章:

  • CentOS 7.6 + Docker:搭建后端常用的开发环境
  • springboot3 configuration
  • 软件质量保证与测试实验
  • 【计算机CPU架构】x86架构简介
  • <collection> 标签:用于定义 一对多关系 的映射规则
  • 【Python 集合 Set 】全面学习指南
  • 可转债双低轮动策略
  • c/c++怎样编写可变参数函数.
  • 第二章网络io
  • Spring MVC 的的核心原理与实践指南
  • PySide6 GUI 学习笔记——常用类及控件使用方法(常用图像类)
  • Python入门手册:条件判断
  • 【GitHub Pages】部署指南
  • idea 快捷键大全
  • SQL进阶之旅 Day 2:基础查询优化技巧
  • 李沐《动手学深度学习》| 4.4 模型的选择、过拟合和欠拟合.md
  • 以太坊的基本理解
  • 强化学习的前世今生(二)
  • 数量优势:使用Bagging和Boosting的集成模型
  • 计算机网络-WebSocket/DNS/Cookie/Session/Token/Jwt/Nginx
  • 网站地市频道建设/seoul national university
  • 电子商务网站建设费用/百度域名收录
  • 中国住房城乡建设厅网站/中国移动有免费的视频app
  • 网站需要备案吗/站内营销推广方式
  • 网站特效网/成都seo技术
  • 有没有做网站的/长沙网站推广合作