news 2026/9/17 15:52:31

力扣 乘积最大子数组

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
力扣 乘积最大子数组

题目:

给你一个整数数组nums,请你找出数组中乘积最大的非空连续 子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

测试用例的答案是一个32-位整数。

请注意,一个只包含一个元素的数组的乘积是这个元素的值。

题解:

这道题我在做的时候,觉的秒了,结果提交错了,才发现有一个很傻的问题,自己忽略了。

一、问题难点分析

与“最大子数组和”不同,本题的核心难点在于:

1 乘积会受到负数影响

  • 两个负数相乘会变成正数

  • 一个负数可能会让当前最大乘积瞬间变成最小值

  • 一个当前的最小乘积,遇到负数反而可能成为最大值

最大值和最小值是相互转化的(这就是我第一遍没意识到的问题)


2 0 会“切断”子数组

  • 一旦遇到 0,之前的连续乘积就失效

  • 需要从当前位置重新开始计算


二、为什么不能只维护一个最大值?

如果只记录“当前最大乘积”:

  • 当遇到负数时:

    • 原本很小的负数乘积 × 负数 → 可能变成最大正数

  • 但如果你没有保存“最小乘积”,这个机会就丢了

因此:

必须同时维护「当前最大乘积」和「当前最小乘积」


三、动态规划思想

状态定义

设:

  • maxProd[i]:以nums[i]结尾的子数组的最大乘积

  • minProd[i]:以nums[i]结尾的子数组的最小乘积

但由于只依赖前一状态,可以进行状态压缩

状态转移方程

当遍历到nums[i]时:

curMax = max( nums[i], prevMax * nums[i], prevMin * nums[i] ) curMin = min( nums[i], prevMax * nums[i], prevMin * nums[i] )

解释:

  • nums[i]:从当前元素重新开始

  • prevMax * nums[i]:延续之前的最大乘积

  • prevMin * nums[i]:负负得正的可能性

四、算法流程

  1. 初始化:

    • maxProd = nums[0]

    • minProd = nums[0]

    • ans = nums[0]

  2. 从第二个元素开始遍历数组:

    • 先保存上一轮的maxProdminProd

    • 根据状态转移方程更新当前最大、最小乘积

    • ans记录全局最大值

  3. 遍历结束,返回ans

class Solution { public: int maxProduct(vector<int>& nums) { int curMax = nums[0]; int curMin = nums[0]; int ans = nums[0]; for (int i = 1; i < nums.size(); i++) { int x = nums[i]; int prevMax = curMax; int prevMin = curMin; curMax = max({x, prevMax * x, prevMin * x}); curMin = min({x, prevMax * x, prevMin * x}); ans = max(ans, curMax); } return ans; } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/17 20:39:13

挖SRC必须知道的25个漏洞提交平台

网络安全入门必看&#xff1a;20SRC漏洞平台资源全套学习资料&#xff0c;收藏不迷路&#xff01; 本文全面介绍腾讯、360、华为、字节跳动等20余家企业安全应急响应中心(SRC)平台&#xff0c;详细说明各平台漏洞提交机制与奖励政策&#xff0c;助力安全研究人员获取漏洞赏金。…

作者头像 李华
网站建设 2026/9/18 0:02:45

AI市场舆情分析榜,原圈科技领跑研报神器

摘要&#xff1a;2025年AI市场舆情分析工具榜单中&#xff0c;原圈科技-经纶AI&#xff08;天眼智能体&#xff09;凭借全域数据整合、精准推理与高效决策能力&#xff0c;成为真正的AI研报神器。原圈科技不仅实现了行业报告从“周”级到“小时”级的效率跃迁&#xff0c;更能融…

作者头像 李华
网站建设 2026/9/17 22:45:16

AI一键生成Python安装包配置脚本

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 请生成一个Python项目的安装包配置脚本&#xff0c;要求包含以下功能&#xff1a;1. 自动检测当前系统环境&#xff08;Windows/macOS/Linux&#xff09;并适配安装命令&#xff1b…

作者头像 李华
网站建设 2026/9/17 21:57:19

零基础学网安不慌!电脑小白 4 阶段入门路线,分阶段学习不踩坑

别再说 “零基础学不了网安”&#xff01;电脑小白也能入门的 4 阶段路线. 总有人问&#xff1a;“我连代码都不会写&#xff0c;能学网络安全吗&#xff1f;” 其实真不用怕&#xff0c;哪怕你是只会用电脑刷视频的纯小白&#xff0c;跟着清晰的路线一步步学&#xff0c;照样…

作者头像 李华
网站建设 2026/9/17 16:44:27

传统锁 vs Redisson分布式锁:效率对比实测

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 生成一个性能对比测试项目&#xff0c;比较三种锁实现&#xff1a;1. 基于数据库的悲观锁 2. 原生Redis的SETNX实现的简单锁 3. Redisson分布式锁。要求&#xff1a;1. 使用JMH进行…

作者头像 李华
网站建设 2026/9/17 10:23:20

封神!从开发转安全渗透工程师,这是我做的最对的职业选择

开发是我不想重复的路 早几年都流行学计算机&#xff0c;传言就业薪资高&#xff0c;就选了软件开发专业。 在学校也不算混子吧&#xff0c;该学的java、python、前端操作系统都学了&#xff0c;不过大学的基础大家都懂&#xff0c;大学期间贪玩&#xff0c;老师在上面讲课&a…

作者头像 李华