news 2026/5/26 5:47:35

从加法到乘法:乘积最大子数组的“正负陷阱”

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从加法到乘法:乘积最大子数组的“正负陷阱”

🟢 题目速览

LeetCode 152. 乘积最大子数组

给你一个整数数组nums

找出乘积最大的非空连续子数组,返回这个最大乘积。

⚠️ 注意:

  • 必须是连续的

  • 答案保证在 32-bit 整数范围内

  • 单个元素也算子数组

示例

输入:nums = [2,3,-2,4] 输出:6 解释:[2,3] 的乘积最大
输入:nums = [-2,0,-1] 输出:0

🧠 我的第一反应(又踩坑了)

看到“最大子数组”,大脑秒回Kadane 算法

maxEndingHere = max(nums[i], maxEndingHere + nums[i])

❌ 直接套用 → 错得离谱

原因只有一个字:

负 × 负 = 正


🚨 核心难点

在加法里:

  • 前面是负数 → 直接丢掉

但在乘法里:

  • 一个很小的负数

  • 可能遇到另一个负数

  • 瞬间变成最大值

👉最小值可能变成最大值


✅ 正确思路:同时维护最大 & 最小

定义两个变量:

  • maxProd:以当前位置结尾的最大乘积

  • minProd:以当前位置结尾的最小乘积

状态转移:

tempMax = max(nums[i], maxProd * nums[i], minProd * nums[i]) tempMin = min(nums[i], maxProd * nums[i], minProd * nums[i])

✨ 最优解代码(面试版)

class Solution { public int maxProduct(int[] nums) { int maxProd = nums[0]; int minProd = nums[0]; int ans = nums[0]; for (int i = 1; i < nums.length; i++) { int tempMax = Math.max( nums[i], Math.max(maxProd * nums[i], minProd * nums[i]) ); int tempMin = Math.min( nums[i], Math.min(maxProd * nums[i], minProd * nums[i]) ); maxProd = tempMax; minProd = tempMin; ans = Math.max(ans, maxProd); } return ans; } }

🔍 执行过程拆解

nums = [2,3,-2,4]为例:

i

nums[i]

maxProd

minProd

ans

0

2

2

2

2

1

3

6

3

6

2

-2

-2

-12

6

3

4

4

-48

6

✅ 最终答案:6


⚡ 为什么这题是 Hot100 必刷

  • Kadane 算法的升级版

  • 负数处理极具代表性

  • 面试高频(字节 / 阿里 / 拼多多)

  • 衍生题极多(最大和、环形数组、二维)


🎯 我学到的东西

在乘法世界里,最小值和最大值永远在一起

你不是在选路径,

而是在防止“最坏情况变成最好情况”。


⚠️ 易错点总结

错误

正确

只维护最大值

必须同时维护最小值

忽略 0

0 会重置整个状态

用加法 DP

这是乘法问题

用排序

子数组必须连续


🧩 一句话总结

乘法的最大子数组,必须在“最好”和“最坏”之间反复横跳。


🎤 面试收尾(建议直接背)

“这道题是经典 Kadane 算法的变形。

由于负数的存在,最大值可能来自最小值乘以负数,

因此我们需要同时维护以当前位置结尾的最大值和最小值。

时间复杂度 O(n),空间复杂度 O(1)。”

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 5:38:56

FlashDB vs. EasyFlash:嵌入式项目数据存储方案怎么选?实测对比告诉你

FlashDB与EasyFlash深度对比&#xff1a;嵌入式存储方案选型实战指南在物联网设备开发中&#xff0c;数据存储方案的选择往往直接影响产品的稳定性和长期维护成本。面对市面上众多的轻量级嵌入式存储方案&#xff0c;开发者常常陷入选择困境。本文将聚焦两款主流方案——FlashD…

作者头像 李华
网站建设 2026/5/26 5:34:38

DeepSeek LeetCode 2663.字典序最小的的美丽字符串 Java实现

以下是 LeetCode 2663“字典序最小的美丽字符串”的 Java 实现。解题思路1. 理解“美丽字符串”&#xff1a; 长度为 n 只包含前 k 个小写字母 不包含任何长度大于 1 的回文子串 实际上只需检查长度为 2 和 3 的回文&#xff08;因为更长回文一定包含短回文&#xff09; 2. 核心…

作者头像 李华
网站建设 2026/5/26 5:33:35

告别硬件IIC:用STM32F407的GPIO模拟IIC读写AT24C02 EEPROM实战

STM32F407模拟IIC驱动AT24C02全解析&#xff1a;从硬件缺陷到软件突围在嵌入式开发中&#xff0c;IIC总线因其简单的两线制结构&#xff08;SCL时钟线和SDA数据线&#xff09;被广泛应用于各类低速外设通信。然而许多STM32开发者都遭遇过这样的困境&#xff1a;硬件IIC模块在实…

作者头像 李华
网站建设 2026/5/26 5:33:34

手写Excel摊销表:从PMT到PPMT的金融函数精解与精度控制

1. 为什么我坚持手写一张Excel摊销表&#xff0c;而不是用现成模板或在线计算器刚入行做财务分析那会儿&#xff0c;我总以为“能跑通就行”——找一个网上下载的摊销模板&#xff0c;改几个数字&#xff0c;导出PDF交差。直到有次给客户做房贷优化方案&#xff0c;对方指着我表…

作者头像 李华
网站建设 2026/5/26 5:29:36

Excel与Tableau高效协同:从数据清洗到动态看板实战指南

1. 为什么你手里的Excel表格&#xff0c;总在关键时刻“卡住”了&#xff1f;Excel用得再熟&#xff0c;也逃不过那个熟悉的窒息时刻&#xff1a;报表改到第17版&#xff0c;老板突然问“上季度华东区环比增长多少&#xff1f;能不能按产品线拆开看&#xff1f;”——你手指悬在…

作者头像 李华