题目
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
示例 :
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
注意点
1、动态规划思想类似数学中的数学归纳法;
2、确定状态方程:
- max[n]:表示以n为下标为结尾的连续数组的最大乘积;(此处为了优化空间,只是用 max(当前元素)和 preMax(前一元素)记录以该元素结尾的最大乘积)
- min[n]:表示以n为下标为结尾的连续数组的最小乘积;(同上)
- result[n]:表示从第一个元素到当前元素中乘积最大的连续子数组的乘积;(此处只使用result记录最新的最大值)
3、此处为什么不仅需要计算最大值,而且需要计算最小值,因为应该考虑正负导致最大值变最小值或最小值变最大值问题;
- 比如以前一元素为结尾的最大值为10,最小值为-5,当前值为 -3,则max[n - 1] * nums[n] = 10 * -5 = -50,变成了最小值;而min[n - 1] * nums[n] = -5 * -3 = 15,变成了最大值。
4、确定状态转移方程:
- 计算以当前元素为结尾的最大值和最小值,则取当前值(nums[n])和前一元素的最大值与当前值的乘积的最大值(max[n] * nums[n] 或 min[n] * nums[n])中大的一方;(最小值同理)
- 计算从第一个元素到当前元素中乘积最大的连续子数组的乘积(1 ~n),则取以当前元素为结尾的最大值(max[n])和从第一个元素到前一元素中乘积最大的连续子数组的乘积(result[n - 1])中大的一方。