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

LeetCode 152. 乘积最大子数组:从双状态DP到空间优化【C++/Java精讲】

1. 问题引入为什么乘积最大子数组这么难第一次看到LeetCode 152题时我心想这不就是最大子数组和的变种吗结果被负数狠狠教育了。还记得当时用最大子数组和的思路写代码遇到[2,-3,-2,4]直接翻车——正确答案应该是48全数组乘积但我的代码却返回6前两个数乘积。关键矛盾点在于乘积具有符号敏感性。一个负数能让最大值瞬间变最小值也能让最小值逆袭成最大值。举个例子当前最大值是6遇到-26 × (-2) -12变成最小值当前最小值是-3遇到-2-3 × (-2) 6反而成了最大值这就像坐过山车必须同时记录最高点和最低点才能应对突然的下坠或上升。这也是为什么简单的单状态DP会失效必须引入双状态动态规划。2. 双状态DP的核心思想2.1 状态定义的艺术传统DP通常用f[i]表示以nums[i]结尾的子数组最优解但在这里我们需要两个数组maxDP[i]以nums[i]结尾的子数组最大乘积minDP[i]以nums[i]结尾的子数组最小乘积为什么需要最小值看这个例子nums [3, -2, -4]当处理到-4时前一步的最大值是3 × (-2) -6前一步的最小值就是-2本身-6 × (-4) 24新的最大值来自最小值×负数2.2 状态转移方程推导状态转移需要考虑三种情况以maxDP[i]为例自立门户从当前数字重新开始nums[i]继承遗产maxDP[i-1] * nums[i]正数乘正数逆袭翻盘minDP[i-1] * nums[i]负数乘负数用数学表达式就是maxDP[i] \max(nums[i],\ maxDP[i-1]×nums[i],\ minDP[i-1]×nums[i]) minDP[i] \min(nums[i],\ minDP[i-1]×nums[i],\ maxDP[i-1]×nums[i])2.3 初始化与边界处理初始状态很简单当i0时子数组只能是nums[0]本身maxDP[0] minDP[0] nums[0];但要注意数组越界问题。有次我写Java代码时没检查空数组直接nums[0]导致崩溃。完整初始化应该if (nums.length 0) return 0; int res nums[0];3. C与Java实现对比3.1 C实现细节class Solution { public: int maxProduct(vectorint nums) { if (nums.empty()) return 0; int res nums[0], n nums.size(); vectorint maxDP(n), minDP(n); maxDP[0] minDP[0] nums[0]; for (int i 1; i n; i) { maxDP[i] max(nums[i], max(maxDP[i-1]*nums[i], minDP[i-1]*nums[i])); minDP[i] min(nums[i], min(minDP[i-1]*nums[i], maxDP[i-1]*nums[i])); res max(res, maxDP[i]); } return res; } };性能特点vector的连续内存访问效率高注意max的三重嵌套调用可以拆分成两步更清晰3.2 Java实现注意点class Solution { public int maxProduct(int[] nums) { if (nums.length 0) return 0; int res nums[0]; int[] maxDP new int[nums.length]; int[] minDP new int[nums.length]; maxDP[0] minDP[0] nums[0]; for (int i 1; i nums.length; i) { maxDP[i] Math.max(nums[i], Math.max(maxDP[i-1]*nums[i], minDP[i-1]*nums[i])); minDP[i] Math.min(nums[i], Math.min(minDP[i-1]*nums[i], maxDP[i-1]*nums[i])); res Math.max(res, maxDP[i]); } return res; } }易错点Java数组初始化自动填0但我们的逻辑不需要这个特性Math.max只支持两个参数需要嵌套调用4. 空间优化从O(n)到O(1)4.1 为什么可以优化观察状态转移方程发现maxDP[i]和minDP[i]只依赖于前一个状态。就像斐波那契数列我们不需要保存整个数组只需维护滚动变量。4.2 优化后的C实现int maxProduct(vectorint nums) { if (nums.empty()) return 0; int res nums[0], maxP nums[0], minP nums[0]; for (int i 1; i nums.size(); i) { int currMax max(nums[i], max(maxP*nums[i], minP*nums[i])); int currMin min(nums[i], min(minP*nums[i], maxP*nums[i])); res max(res, currMax); maxP currMax; // 注意要先更新res再覆盖变量 minP currMin; } return res; }关键技巧使用currMax和currMin作为临时变量更新顺序很重要先计算→更新res→最后覆盖旧值4.3 Java优化版public int maxProduct(int[] nums) { if (nums.length 0) return 0; int res nums[0], maxP nums[0], minP nums[0]; for (int i 1; i nums.length; i) { int preMax maxP; // 必须保存旧值 maxP Math.max(nums[i], Math.max(maxP*nums[i], minP*nums[i])); minP Math.min(nums[i], Math.min(minP*nums[i], preMax*nums[i])); res Math.max(res, maxP); } return res; }踩坑记录直接使用maxP计算minP会导致值被覆盖必须先用preMax保存旧值实测下来空间消耗从40MB降到38MB虽然不多但算法更优雅5. 测试用例设计技巧好的测试用例能帮你发现90%的bug我总结了几类必测场景用例类型示例输入预期输出检查目标全正数[2,3,4]24基础功能含单个负数[2,-3,4]4负数中断连续性负号反转[-2,3,-4]24最小值变最大值含零[2,0,3]3零值重置全负数[-2,-3,-1]6负负得正单元素[5]5边界条件特别建议测试[3,-1,4,-1,2]这个案例最优解是48全部相乘能检验算法是否考虑全局乘积。

相关文章:

LeetCode 152. 乘积最大子数组:从双状态DP到空间优化【C++/Java精讲】

1. 问题引入:为什么乘积最大子数组这么难? 第一次看到LeetCode 152题时,我心想:"这不就是最大子数组和的变种吗?"结果被负数狠狠教育了。还记得当时用最大子数组和的思路写代码,遇到[2,-3,-2,4]…...

ConvNeXt 系列改进:添加门控通道变换(GCT),轻量化涨点(仅增加 0.1M 参数)

ConvNeXt 自从由 Meta AI(原 Facebook AI Research)提出以来,已经彻底改变了我们对纯卷积神经网络的认知。根据 ConvNeXt 官方文档,ConvNeXts 完全由标准 ConvNet 模块构建而成,在准确性和可扩展性方面与 Transformers 竞争,实现了 87.8% 的 ImageNet top-1 准确性,并在…...

企业级报表工具润乾报表的安全审计:从dataSphereServlet接口看文件上传风险

企业级报表工具安全审计实战:从接口风险到供应链防护 报表系统作为企业数据流转的核心枢纽,其安全性直接影响业务数据的完整性与机密性。某次内部安全评估中,我们发现部署在财务系统的报表组件存在异常文件写入行为,追踪发现是源于…...

5分钟终极指南:TegraRcmGUI让你轻松玩转Switch注入

5分钟终极指南:TegraRcmGUI让你轻松玩转Switch注入 【免费下载链接】TegraRcmGUI C GUI for TegraRcmSmash (Fuse Gele exploit for Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/te/TegraRcmGUI 还在为Nintendo Switch的注入操作感到困惑吗&…...

从特斯拉AEB误触发事件看SOTIF标准:如何避免自动驾驶系统‘过度反应‘?

从特斯拉AEB误触发事件看SOTIF标准:如何避免自动驾驶系统"过度反应"? 去年某高速公路上,一辆开启Autopilot功能的特斯拉Model 3突然急刹,导致后车追尾。事后调查发现,系统将倾斜的路牌误判为静止车辆——这不…...

SDMatte与智能体(Agent)结合:构建自主化的图片内容审核流水线

SDMatte与智能体(Agent)结合:构建自主化的图片内容审核流水线 1. 引言:当AI遇上内容审核 电商平台每天新增数百万张用户上传的商品图片,社交媒体每小时产生上亿条UGC内容。传统人工审核团队面对这样的数据洪流&#…...

Lychee-Rerank效果展示:教育题库场景中题目与知识点匹配的精准打分

Lychee-Rerank效果展示:教育题库场景中题目与知识点匹配的精准打分 1. 项目简介 Lychee-Rerank是一个基于Qwen2.5-1.5B模型的本地检索相关性评分工具,专门为查询与文档匹配度打分场景设计。这个工具完美复现了Lychee官方推理逻辑,通过纯本地…...

CLIP模型调优新思路:用CoCoOp实现动态提示学习(附代码实战)

CLIP模型调优新思路:用CoCoOp实现动态提示学习(附代码实战) 在计算机视觉与自然语言处理的交叉领域,视觉语言模型正掀起一场革命。CLIP作为这一领域的里程碑式模型,通过对比学习将图像和文本映射到同一语义空间&#x…...

3步掌握智能音频分割:Audio Slicer高效处理语音与播客

3步掌握智能音频分割:Audio Slicer高效处理语音与播客 【免费下载链接】audio-slicer A simple GUI application that slices audio with silence detection 项目地址: https://gitcode.com/gh_mirrors/aud/audio-slicer 在音频内容创作和数据预处理领域&…...

树莓派4推出3GB内存版,我却不再推荐它了

2026年4月1日,树莓派官方发布了一款新品——树莓派4 3GB内存版,定价83.75美元。这条消息刚出来时,我还以为是愚人节玩笑,毕竟日期太巧了。结果不是玩笑,而是真实产品,而且伴随而来的是又一轮内存驱动的涨价…...

抖音下载器终极指南:解锁无水印内容的高效获取之道

抖音下载器终极指南:解锁无水印内容的高效获取之道 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support.…...

BLIP 实战手册:从零到一完成 Image-Text Captioning 任务微调

1. 认识BLIP与Image-Text Captioning 第一次接触BLIP模型时,我被它处理图像和文本的能力惊艳到了。想象一下,你给模型一张猫咪晒太阳的照片,它能自动生成"一只橘猫在窗台上慵懒地晒太阳"这样的描述——这就是Image-Text Captioning…...

国产芯片如何用JLINK+JFlash烧录?极海APM32/英迪芯IND83205案例详解

国产芯片JLINK烧录实战:极海APM32与英迪芯IND83205全流程解析 当国产MCU逐渐成为工程师的新选择,如何高效完成程序烧录成为开发者面临的首要问题。不同于国际大厂芯片的标准支持,国产芯片往往需要更灵活的工具链适配。本文将深入探讨如何利用…...

一键构建25000+ASMR音频库:asmr-downloader高效下载与管理指南

一键构建25000ASMR音频库:asmr-downloader高效下载与管理指南 【免费下载链接】asmr-downloader A tool for download asmr media from asmr.one(Thanks for the asmr.one) 项目地址: https://gitcode.com/gh_mirrors/as/asmr-downloader 在数字化的放松体验…...

书匠策AI:毕业论文写作的“智能魔法棒”,开启学术新纪元!

在学术的浩瀚宇宙中,毕业论文如同璀璨星辰,既照亮了我们求知的道路,也考验着我们的智慧与毅力。然而,撰写一篇高质量的毕业论文并非易事,它需要我们跨越选题迷雾、穿越文献丛林、构建逻辑框架、雕琢内容细节&#xff0…...

零基础极速上手:用AI建站工具10分钟生成你的第一个网站

痛点与目标看着别人轻松拥有自己的品牌官网,你是不是也心动了,却因为不懂代码、不会设计、预算有限而迟迟没动手?别担心,搭建专业网站的门槛已经被新一代的AI生成网站工具彻底打破了。即使你完全不懂技术,也能在10分钟…...

ANARCI抗体序列编号:生物信息学研究的终极利器

ANARCI抗体序列编号:生物信息学研究的终极利器 【免费下载链接】ANARCI Antibody Numbering and Antigen Receptor ClassIfication 项目地址: https://gitcode.com/gh_mirrors/an/ANARCI 在抗体研究和免疫组库分析中,科学家们面临着一个共同的挑战…...

基于深度学习的yolov8+v11+v5的仪器仪表读数识别 yolo+pose关键点的指针仪表读数工业检测 仪表读数

博主主页:[ ](https://blog.csdn.net/QQ_1309399183?typeblog) 博主简介:计算机视觉领域优质创作者、CSDN博客专家、阿里云专家博主、全网粉丝5万、专注计算机视觉技术领域和毕业相关项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容&am…...

别再只用Rect和Circle了!解锁CocosCreator Mask._graphics的隐藏玩法:自定义笔刷与动态擦除动画

突破常规:用CocosCreator Mask._graphics打造高级动态擦除艺术 在数字创作的世界里,擦除效果早已超越了简单的"刮刮卡"和"橡皮擦"概念。当大多数开发者还在使用基础的圆形和矩形遮罩时,那些掌握Mask._graphics深度技巧的…...

Intv_AI_MK11 STM32嵌入式AI入门:模型轻量化与MCU部署初探

Intv_AI_MK11 STM32嵌入式AI入门:模型轻量化与MCU部署初探 1. 嵌入式AI与STM32的奇妙组合 想象一下,你的家用电器能听懂语音指令,工厂设备可以自主检测故障,甚至一块小小的手表都能识别你的手势操作。这些看似神奇的智能功能&am…...

完全免费!跨平台开源音乐播放器LX Music桌面版终极使用指南

完全免费!跨平台开源音乐播放器LX Music桌面版终极使用指南 【免费下载链接】lx-music-desktop 一个基于 Electron 的音乐软件 项目地址: https://gitcode.com/GitHub_Trending/lx/lx-music-desktop 你是否厌倦了各大音乐平台的会员限制?想要一款…...

GLM-4.1V-9B-Base对比YOLOv5:多模态理解与纯视觉检测的任务边界

GLM-4.1V-9B-Base对比YOLOv5:多模态理解与纯视觉检测的任务边界 1. 开场效果震撼展示 当一张复杂的街景图片同时输入到GLM-4.1V-9B-Base和YOLOv5两个模型中,我们看到了截然不同的处理方式。YOLOv5迅速在图片上标出了12个物体框:"汽车-…...

洛雪音乐助手:3步快速上手的免费开源音乐播放器

洛雪音乐助手:3步快速上手的免费开源音乐播放器 【免费下载链接】lx-music-desktop 一个基于 Electron 的音乐软件 项目地址: https://gitcode.com/GitHub_Trending/lx/lx-music-desktop 洛雪音乐助手是一款基于Electron和Vue开发的免费开源跨平台音乐软件&a…...

5分钟快速搞定:Axure RP中文语言包终极使用指南

5分钟快速搞定:Axure RP中文语言包终极使用指南 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文…...

本地验证:构建、单元测试与集成测试的自动化执行策略

本地验证:构建、单元测试与集成测试的自动化执行策略 从一次深夜调试说起 上周排查一个内存泄漏问题,花了两小时才发现是单元测试根本没跑起来——CMakeLists里add_test写错了目录路径,但本地make test居然返回了成功。这种“假绿灯”比编译失败更可怕,代码合进主线后CI才…...

别再傻傻分不清了!GIS里Clip和Mask到底怎么用?附ArcGIS/QGIS实操对比

GIS空间分析实战:Clip与Mask工具的核心差异与操作指南 每次打开GIS软件,面对工具箱里密密麻麻的工具图标,新手总会陷入选择困难——尤其是功能看似相似的Clip和Mask。上周有位林业局的朋友发来求助:他用Clip处理卫星影像后&#x…...

Win11系统如何通过CMD快速配置FTP服务器?一步步教你搞定

Win11系统通过CMD高效搭建FTP服务器的完整指南 在当今快节奏的开发环境中,能够快速部署本地文件共享服务是每个技术人员的必备技能。虽然市面上有各种FTP服务器软件,但掌握通过命令行直接配置的方法不仅能提升效率,还能为自动化脚本集成打下…...

终极指南:如何免费解锁Cursor AI Pro功能,告别试用限制

终极指南:如何免费解锁Cursor AI Pro功能,告别试用限制 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reac…...

Xtreme Download Manager:解决大文件下载与视频抓取难题的终极方案

Xtreme Download Manager:解决大文件下载与视频抓取难题的终极方案 【免费下载链接】xdm Powerfull download accelerator and video downloader 项目地址: https://gitcode.com/gh_mirrors/xd/xdm 你是否曾因下载大文件速度缓慢而烦恼?是否想在Y…...

Obsidian Excel插件:在笔记中轻松管理电子表格的完整指南

Obsidian Excel插件:在笔记中轻松管理电子表格的完整指南 【免费下载链接】obsidian-excel 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-excel 在知识管理工具Obsidian中,Excel表格功能一直是用户期待的重要扩展。Obsidian Excel插件…...