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

力扣HOT100之动态规划:152. 乘积最大子数组


这道题并不是代码随想录里的,我试着用动规五部曲来做,然后不能通过全部测试样例,在第109个测试样例卡住了,如下所示。

原因是可能负数乘以负数会得到最大的乘积,不能单纯地用上一个序列的最大值乘以当前值来判断是否能得到更大值。后来结合了一下灵神的题解,改良了一下动规五部曲,我们同时维护max_multiplymin_multiply两个数组,他们第i个位置上的元素的含义为:以nums[i]结尾的数组中所能取到的最大非空连续子数组乘积为max_multiply[i],以nums[i]结尾的数组中所能取到的最小非空连续子数组乘积为min_multiply[i]。而dp[i]的含义为:以nums[i]为结尾的情况下,所能取到的非空连续子数组的最大乘积。我们可以得到如下4种情况:

  1. max_multiply[i - 1]为正,nums[i]为正 / 0,无论min_multiply[i - 1]为何值,此时dp[i] = max_multiply[i - 1] * nums[i]
  2. max_multiply[i - 1]为负,nums[i]为正 / 0,min_multiply[i - 1]只能为负,此时dp[i] = nums[i]
  3. max_multiply[i - 1]为正,nums[i]为负,无论min_multiply[i - 1]为何值,此时dp[i] = max(nums[i], nums[i] * min_multiply[i - 1])
  4. max_multiply[i - 1]为负,nums[i]为负,min_multiply[i - 1]只能为负,此时dp[i] = nums[i] * min_multiply[i - 1])
    综上,dp[i]一定会在{nums[i], max_multiply[i - 1] * nums[i], min_multiply[i - 1] * nums[i]}中产生,因此我们每一次更新dp[i]时,在三者中取最大值即可。下面给出动规五部曲:
    1.确定dp[i]的含义:以nums[i]为结尾的情况下,所能取到的非空连续子数组的最大乘积
    2.确定递推公式 dp[i] = max_multiply[i];
    3.dp数组初始化 dp[0] = nums[0]
    4.确定遍历顺序:从左往右遍历
    5.打印数组(省略)
    同样,最大乘积不一定是以最后一个元素结尾构成的连续子数组产生的,我们同样用一个变量result来维护最大乘积。
class Solution {
public:int maxProduct(vector<int>& nums) {//1.确定dp[i]的含义:以nums[i]为结尾的情况下,所能取到的非空连续子数组的最大乘积//2.确定递推公式  dp[i] = max(nums[i], nums[i] * dp[i - 1]);//3.dp数组初始化 dp[0] = nums[0]  //4.确定遍历顺序:从左往右遍历//5.打印数组(省略)int n = nums.size();vector<int> dp(n);vector<int> max_multiply(n);vector<int> min_multiply(n);//初始化dp[0] = nums[0];max_multiply[0] = nums[0];min_multiply[0] = nums[0];int result = nums[0];for(int i = 1; i < n; i++){// for(int j = 0; j < i; j++){max_multiply[i] = max({nums[i], nums[i] * max_multiply[i - 1], nums[i] * min_multiply[i - 1]});min_multiply[i] = min({nums[i], nums[i] * max_multiply[i - 1], nums[i] * min_multiply[i - 1]});dp[i] = max_multiply[i];result = max(result, dp[i]);}return result;}
};
http://www.lryc.cn/news/2393993.html

相关文章:

  • Java后端技术栈问题排查实战:Spring Boot启动慢、Redis缓存击穿与Kafka消费堆积
  • 定制开发开源AI智能名片S2B2C商城小程序:数字营销时代的话语权重构
  • 【面试 - 遇到的问题 - 优化 - 地图】腾讯地图轨迹回放 - 回放的轨迹时间要和现实时间对应(非匀速)
  • ffmpeg baidu
  • spring boot 拦截器HandlerInterceptor 不生效的原因排查
  • 公网ip怎么申请和使用?本地只有内网IP如何提供外网访问?
  • 将git最后一次提交把涉及到的文件按原来目录结构提取出来
  • 利用计算机模拟和玉米壳废料开发新型抗病毒药物合成方法
  • 【Docker】存储卷
  • Python 爬虫工具 BeautifulSoup
  • WPF的布局核心:网格布局(Grid)
  • OpenCV图像认知(二)
  • 大数据与数据分析【数据分析全栈攻略:爬虫+处理+可视化+报告】
  • t015-预报名管理系统设计与实现 【含源码!!!】
  • LLM中的Loss与Logits详解
  • 数学术语之源——绝对值(absolute value)(复数模?)
  • 亚马逊商品评论爬取与情感分析:Python+BeautifulSoup实战(含防封策略)
  • STM32的DMA入门指南:让单片机学会“自动搬运“数据
  • 从虚拟化到云原生与Serverless
  • OpenAI o3安全危机:AI“抗命”背后的技术暗战与产业变局
  • Bootstrap:精通级教程(VIP10万字版)
  • 技术创新如何赋能音视频直播行业?
  • leetcode1201. 丑数 III -medium
  • ai工具集:AI材料星ppt生成,让你的演示更出彩
  • @Prometheus 监控操作系统-Exporter(Win Linux)
  • LINUX530 rsync定时同步 环境配置
  • CMG 机器人格斗大赛举行,宇树人形机器人参赛,比赛有哪些看点?对行业意味着什么?
  • Python——MySQL远程控制
  • 异常:UnsupportedOperationException: null
  • Ubuntu 24.04 LTS 和 ROS 2 Jazzy 环境中使用 Livox MID360 雷达