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

动态规划-152.乘积最大子数组-力扣(LeetCode)

一、题目解析

根据示例nums数组中存在负数,下面分析时需注意

二、算法原理

1、状态表示

 

此时f[i]表示:以i位置为结尾的所有子数组中的最大乘积,但是由于nums中存在负数,所以还需要g[i]表示:以i位置为结尾的所有子数组中的最小乘积

2、状态转移方程

 

f[i]=max(nums[i],max(f[i-1]*nums[i],g[i-1]*nums[i]))

g[i]的分析过程差不多这里直接给出

g[i]=min(nums[i],min(g[i-1]*nums[i],f[i-1]*nums[i]))

3、初始化

由于要使用f[i-1]和g[i-1]所以可以选择直接初始化f[0]和g[0],也可以使用虚拟节点,即开辟空间时多开辟一个,用于初始化计算,且为了计算结果不影响后面填表,所以初始化为1,尤为注意我们初始化加了一格,下标的映射关系改变。

4、填表顺序

为了保证所需值已被计算,从左往右,两个表一起填。

5、返回值

根据题目要求我们只需要返回f表中的最大值即可

代码能力是需要实操的,坚持下来,152. 乘积最大子数组 - 力扣(LeetCode) 

三、代码示例

class Solution {
public:int maxProduct(vector<int>& nums) {int n = nums.size();vector<int> f(n+1,1),g(n+1,1);for(int i = 1;i<=n;i++){f[i]=max(nums[i-1],max(f[i-1]*nums[i-1],g[i-1]*nums[i-1]));g[i]=min(nums[i-1],min(f[i-1]*nums[i-1],g[i-1]*nums[i-1]));}int f_max = f[1];for(int i = 2;i<=n;i++){if(f[i]>f_max) f_max = f[i];}return f_max;}
};

 

 

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

相关文章:

  • AI模型升级与机器人产业落地同步推进
  • 09《从依赖管理到容器化部署:Maven 全链路实战笔记,解锁 Java 项目自动化构建的终极奥秘》
  • 51c视觉~3D~合集3
  • 深入理解 Maven 循环依赖问题及其解决方案
  • 2022 RoboCom 世界机器人开发者大赛(睿抗 caip) -高职组(国赛)解题报告 | 科学家
  • DexWild:野外机器人策略的灵巧人机交互
  • PH热榜 | 2025-05-29
  • 关于scrapy在pycharm中run可以运行,但是debug不行的问题
  • 【Kubernetes】ubuntu20.04通过kubeadm + Docker安装k8s
  • 上传图片转成3D VR效果 / 用photo-sphere-viewer实现图片VR效果
  • uni-app 安卓消失的字符去哪里了?maxLength失效了!
  • WPF中自定义消息弹窗
  • 每日算法刷题计划Day17 5.29:leetcode复习滑动窗口+二分搜索5道题+二分答案1道题,用时1h20min
  • Java开发经验——阿里巴巴编码规范实践解析8
  • 无人机桥梁3D建模的拍摄频率
  • Transformer《Attention is all you need》
  • 美化显示GDB调试的数据结构
  • 在ROS2(humble)+Gazebo+rqt下,实时显示仿真无人机的相机图像
  • 无人机报警器探测模块技术解析!
  • Spring框架学习day1--基础概念
  • 网站建设布局结构/百度热词
  • 从化网站开发/网络营销策划书2000字
  • 有什么网站可以做数学题/推广软件赚钱
  • 四川省建设厅职业注册中心网站/最常用的网页制作软件
  • 做网站的岗位叫什么问题/产品推广平台
  • 用cms建网站/关键词seo排名优化如何