从加法到乘法:乘积最大子数组的“正负陷阱”
题目速览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]为例inums[i]maxProdminProdans02222136362-2-2-126344-486✅ 最终答案6⚡ 为什么这题是 Hot100 必刷Kadane 算法的升级版负数处理极具代表性面试高频字节 / 阿里 / 拼多多衍生题极多最大和、环形数组、二维 我学到的东西在乘法世界里最小值和最大值永远在一起。你不是在选路径而是在防止“最坏情况变成最好情况”。⚠️ 易错点总结错误正确只维护最大值必须同时维护最小值忽略 00 会重置整个状态用加法 DP这是乘法问题用排序子数组必须连续 一句话总结乘法的最大子数组必须在“最好”和“最坏”之间反复横跳。 面试收尾建议直接背“这道题是经典 Kadane 算法的变形。由于负数的存在最大值可能来自最小值乘以负数因此我们需要同时维护以当前位置结尾的最大值和最小值。时间复杂度 O(n)空间复杂度 O(1)。”