LeetCode 152. 乘积最大子数组 - 动态规划解法详解
文章目录
- 问题描述
- 解题思路
- 动态规划状态定义
- 状态转移方程
- 完整代码实现
- 复杂度分析
- 示例解析
- 关键点说明
- 总结
问题描述
给定一个整数数组 nums
,请找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组对应的乘积。
示例:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6
解题思路
乘积最大子数组问题与和最大子数组问题的关键区别在于乘积的符号特性:负数乘以负数会得到正数。这意味着:
- 不能只维护最大值,还需要维护最小值(因为最小负值可能遇到负数变成最大值)
- 状态转移需要考虑三种情况:当前元素本身、当前元素×前序最大值、当前元素×前序最小值
动态规划状态定义
currentMax
:以当前元素结尾的连续子数组的最大乘积currentMin
:以当前元素结尾的连续子数组的最小乘积maxProduct
:全局最大乘积(最终结果)
状态转移方程
对于每个元素 nums[i]
:
temp = currentMax // 保存前一个位置的最大值
currentMax = max(nums[i], temp * nums[i], currentMin * nums[i])
currentMin = min(nums[i], temp * nums[i], currentMin * nums[i])
maxProduct = max(maxProduct, currentMax)
完整代码实现
class Solution {public int maxProduct(int[] nums) {