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

力扣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.xdnf.cn/news/740881.html

相关文章:

  • leetcode hot100刷题日记——34.将有序数组转换为二叉搜索树
  • 【基于SpringBoot的图书购买系统】Redis中的数据以分页的形式展示:从配置到前后端交互的完整实现
  • Spring Boot启动慢?Redis缓存击穿?Kafka消费堆积?——Java后端常见问题排查实战
  • 【R语言编程绘图-plotly】
  • 华为OD机试真题——生成哈夫曼树(2025A卷:100分)Java/python/JavaScript/C/C++/GO六种最佳实现
  • 《江西棒球资讯》棒球运动发展·棒球1号位
  • RLHF奖励模型的训练
  • 【C#】一个简单的http服务器项目开发过程详解
  • 前端八股HTTP和https大全套
  • Java研学-MongoDB(一)
  • 用JS实现植物大战僵尸(前端作业)
  • 【Oracle】TCL语言
  • Flutter - 原生交互 - 相机Camera - 01
  • 在Windows本地部署Dify详细操作
  • 线程(上)【Linux操作系统】
  • 【Kotlin】简介变量类接口
  • Express中使用MySQL数据库的完整示例
  • python批量解析提取word内容到excel
  • Python趣学篇:交互式词云生成器(jieba + Tkinter + WordCloud等)
  • Microsoft Word使用技巧分享(本科毕业论文版)
  • #AI短视频制作完整教程
  • Acrobat DC v25.001 最新专业版已破,像word一样编辑PDF!
  • VR/AR 视网膜级显示破局:10000PPI 如何终结颗粒感时代?
  • Maven 安装与配置指南(适用于 Windows、Linux 和 macOS)
  • Linux防止误关机
  • Linux 下如何查看进程的资源限制信息?
  • Linux设置静态IP
  • Linux:动静态库
  • 【KWDB 创作者计划】_再热垃圾发电汽轮机仿真与监控系统:KaiwuDB 批量插入10万条数据性能优化实践
  • Python----目标检测(《基于区域提议网络的实时目标检测方法》和Faster R-CNN)