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

动态规划-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;}
};

 

 

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

http://www.lryc.cn/news/2393410.html

相关文章:

  • 1-1 初探Dart编程语言
  • 搭建最新版开源监控平台SigNoz踩的坑
  • Ubuntu 服务器配置与 Cloudflare Tunnel 部署指南 免费内网穿透家用服务器
  • 无人机多人协同控制技术解析
  • 【东枫科技】KrakenSDR 测向快速入门指南
  • 使用LangChain与多模态模型实现图像中的文字和表格提取(PDF可转图片)
  • 【Redis】hash
  • 基于Vite的前端自动化部署方案
  • antDesignVue中a-upload上传组件的使用
  • 龙舟竞渡与芯片制造的共通逻辑:华芯邦的文化破局之道
  • 机房网络设备操作安全管理制度
  • CentOS中安装Docker Compose
  • Linux Kernel动态调试:运行时调试的利器
  • Milvus分区-分片-段结构详解与最佳实践
  • 5月课程精彩回顾 | 2025高通边缘智能创新应用大赛系列公开课
  • 设计模式25——中介者模式
  • 阿里云配置安全组策略开放端口
  • uniapp 搭配uviwe u-picker 实现地区联栋
  • win10电脑时间同步失败的解决方法
  • 每日c/c++题 备战蓝桥杯(Cantor 表)
  • 代码随想录打卡|Day53 图论(Floyd 算法精讲 、A * 算法精讲 (A star算法)、最短路算法总结篇、图论总结 )
  • yum安装nginx后无法通过服务方式启动
  • 数据基座觉醒!大数据+AI如何重构企业智能决策金字塔(下)
  • 在线博客系统【测试报告】
  • Void:免费且隐私友好的 AI 编码利器,挑战 Cursor 地位?
  • Elasticsearch的写入流程介绍
  • 【PCB工艺】PCB设计中的基本概念
  • WPF事件处理器+x名称空间
  • 具身智能:OpenAI 的真正野心与未来展望
  • mybatis的mapper对应的xml写法