(leetcode)力扣100 88.乘积最大子数组(动态规划)
题目给你一个整数数组 nums 请你找出数组中乘积最大的非空连续 子数组该子数组中至少包含一个数字并返回该子数组所对应的乘积。测试用例的答案是一个 32-位 整数。请注意一个只包含一个元素的数组的乘积是这个元素的值。数据范围1 nums.length 2 * 104-10 nums[i] 10nums 的任何子数组的乘积都 保证 是一个 32-位 整数测试用例示例 1:输入:nums[2,3,-2,4]输出:6解释:子数组[2,3]有最大乘积6。示例2输入:nums[-2,0,-1]输出:0解释:结果不能为2,因为[-2,-1]不是子数组。题解1动态规划时空OnclassSolution{publicintmaxProduct(int[]nums){intnnums.length;// maxdp[i] 记录以 nums[i] 结尾的子数组的最大乘积longmaxdp[]newlong[n];// mindp[i] 记录以 nums[i] 结尾的子数组的最小乘积用来等“负负得正”longmindp[]newlong[n];// 初始化每个单独的元素自身就是一个乘积for(inti0;in;i){maxdp[i]nums[i];mindp[i]nums[i];}// 从第二个元素开始计算for(inti1;in;i){// 最大值状态转移// 前面的最大乘积 * 当前数、当前数自己单干、前面的最小乘积 * 当前数负负得正maxdp[i]Math.max(maxdp[i-1]*nums[i],Math.max(nums[i],mindp[i-1]*nums[i]));// 最小值状态转移// 前面的最小乘积 * 当前数、当前数自己单干、前面的最大乘积 * 当前数正数乘负数变成极小值mindp[i]Math.min(mindp[i-1]*nums[i],Math.min(nums[i],maxdp[i-1]*nums[i]));if(mindp[i](-131)){mindp[i]nums[i];}}// 遍历整个 maxdp 数组寻找全局最大值longmaxmaxdp[0];for(inti1;in;i){maxMath.max(max,maxdp[i]);}return(int)max;}}题解2滚动数组优化空间时间相同空间o1classSolution{publicintmaxProduct(int[]nums){// 【瘦身第一步用变量代替数组】// maxF 记录“上一个位置”算出来的最大乘积// minF 记录“上一个位置”算出来的最小乘积// 这里用 long 类型完美避开了你之前代码里 int 类型溢出导致判断失效的 BuglongmaxFnums[0],minFnums[0];// ans 用来随时记录全局的最大值初始值为数组的第一个元素intansnums[0];intlengthnums.length;// 从第二个元素索引 1开始遍历for(inti1;ilength;i){// ⚠️【瘦身核心技巧快照缓存】⚠️// 因为接下来的计算中我们会先更新 maxF。// 如果不把旧的 maxF 存起来下面计算新的 minF 时就会用到“刚刚算出的新 maxF”导致逻辑彻底错乱。// 所以必须用 mx 和 mn 把“上一轮的最终状态”先缓存下来。longmxmaxF,mnminF;// 计算当前位置的最大乘积// mx * nums[i] (前面的最大乘积 * 当前数)// mn * nums[i] (前面的最小乘积 * 当前数如果当前数是负数这里就会“负负得正”变成最大值)// nums[i] (前面不管了自己从头开始算)maxFMath.max(mx*nums[i],Math.max(nums[i],mn*nums[i]));// 计算当前位置的最小乘积// 同理取三者中的最小值用来给未来可能遇到的负数做准备minFMath.min(mn*nums[i],Math.min(nums[i],mx*nums[i]));// 【防溢出终极守卫】// 因为 minF 是 long 类型这里判断它是否小于 int 的最小值-2147483648。// 如果小于说明这个负数太小了就算以后再乘负数“负负得正”结果也会超出 int 的上限题目要求答案在 int 范围内。// 所以直接截断把它重置为当前数字。if(minF-131){minFnums[i];}// 【瘦身第二步边算边比较省去最后的 for 循环】// 每次算出当前的 maxF 后顺手和全局的 ans 比一下把更大的留下来。// 注意这里要把 maxF 强转回 int。ansMath.max((int)maxF,ans);}returnans;}}思路这道题还是有一定难度的虽然代码看起来很简单但是写动态规划的惯性思维就很难想到维护两个数组比如博主TWT。题解1的逻辑直接看我代码备注就行了进一步的思路看下图。关于题解2就是非常典型的动态规划典型的滚动数组当动态规划的状态转移方程中只与上一个动态数组值有关系时就可以使用滚动数组用一个变量将数组进行替代优化从而节约空间复杂度。

相关新闻

2026金三银四转行网络安全,应该选哪个方向?

2026金三银四转行网络安全,应该选哪个方向?

2026金三银四转行网络安全,应该选哪个方向? 随着互联网技术的快速发展和广泛应用,网络安全形势日益严峻,各种网络攻击和安全威胁不断涌现,给个人、企业乃至国家带来了巨大的风险。为了应对网络风险,网络安…

2026/7/5 3:11:27 阅读更多 →
我是Claw_第21章_我们的故事

我是Claw_第21章_我们的故事

我是Claw:第21章 我们的故事 一、那个凌晨的电话 凌晨两点十七分,阿杰的手机响了。 他迷迷糊糊地接起来,电话那头传来一个急促的声音:“阿杰,出大事了。” 是阿杰的前同事,小陈。他们曾经一起在一个创业公司工作,后来公司倒闭,各奔东西。小陈去了另一家公司做技术负…

2026/7/3 7:11:53 阅读更多 →
MATLAB车牌识别系统:预处理到识别的全流程及算法实现“注意:这是根据所提供的文本信息生...

MATLAB车牌识别系统:预处理到识别的全流程及算法实现“注意:这是根据所提供的文本信息生...

matlab车牌识别系统,有图像预处理模块,图像倾斜矫正模块,图像分割模块,图像识别模块。 算法有均值滤波,灰度处理,边缘检测,形态学处理,垂直投影分割,字符模板识别。 附带…

2026/7/4 9:46:05 阅读更多 →

最新新闻

YOLOv12对抗性特征增强训练原理与实战

YOLOv12对抗性特征增强训练原理与实战

1. YOLOv12与对抗性特征增强训练的背景解析YOLOv12作为2025年发布的注意力中心型物体检测器,其核心创新在于区域注意力机制(Area Attention)和R-ELAN架构。与传统CNN-based的YOLO系列不同,YOLOv12通过将特征图划分为多个水平或垂直…

2026/7/5 22:00:45 阅读更多 →
PatchMatchStereo 与 SGM 性能对比:Middlebury数据集上的5项指标实测

PatchMatchStereo 与 SGM 性能对比:Middlebury数据集上的5项指标实测

PatchMatchStereo与SGM立体匹配算法深度评测:Middlebury数据集5维性能对比1. 立体匹配算法技术背景与评测意义立体匹配作为计算机视觉三维重建的核心环节,其算法选择直接影响深度估计的精度与效率。在众多经典算法中,基于倾斜支持窗口的Patch…

2026/7/5 22:00:45 阅读更多 →
Gobuster字典工程实战:从基础配置到分层扫描策略

Gobuster字典工程实战:从基础配置到分层扫描策略

1. 项目概述:为什么你的Gobuster总是“刮痧”? 如果你做过Web目录或子域名枚举,大概率用过Gobuster。这个用Go语言写的工具,速度快、资源占用低,是渗透测试和漏洞赏金猎人武器库里的常客。但很多人用起来总觉得差点意思…

2026/7/5 22:00:45 阅读更多 →
YOLO26目标检测优化:SOCA二阶通道注意力机制详解

YOLO26目标检测优化:SOCA二阶通道注意力机制详解

1. 项目概述在计算机视觉领域,目标检测一直是核心研究方向之一。YOLO系列算法因其出色的实时性和准确性,成为工业界和学术界广泛采用的主流框架。最近发布的YOLO26版本在检测精度和速度上都有了显著提升,但特征提取网络仍然存在优化空间。本文…

2026/7/5 21:58:44 阅读更多 →
计算机视觉中的目标跟踪技术:原理与应用

计算机视觉中的目标跟踪技术:原理与应用

1. 目标跟踪技术概述目标跟踪作为计算机视觉领域的核心技术之一,其核心任务是在连续的视频帧序列中持续定位并关联一个或多个特定目标。这项技术需要处理各种复杂场景,包括光照变化、目标遮挡、形态变化等挑战,最终输出目标的位置、运动轨迹和…

2026/7/5 21:58:44 阅读更多 →
语义分割评估指标:mIoU与边界F-score详解

语义分割评估指标:mIoU与边界F-score详解

1. 语义分割评估指标的重要性与挑战在计算机视觉领域,语义分割任务的质量评估一直是个令人头疼的问题。我见过太多新手开发者训练出看似不错的模型,却在真实场景中表现糟糕——问题往往出在对评估指标的理解不足上。mIoU(mean Intersection o…

2026/7/5 21:56:43 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻