152. 乘积最大子数组
难度中等953
给你一个整数数组 nums
,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
示例 1:
1 | 输入: [2,3,-2,4] |
示例 2:
1 | 输入: [-2,0,-1] |
动态规划(第二次)
分情况讨论:
如果当前的值是正的,要与最大值做乘法才能得到最大值
如果当前的值是负的,要与最小值做乘法才能得到最大值
1 | public class Solution { |
动态规划分情况讨论
因为数字中有正数和负数,正数乘以最大值结果最大,负数乘以最小值结果最大,所以要维护两个表格,一个用来存放当前的最大值一个用来存放当前的最小值。
最后从最大值表中选择最大的一个值即为结果,因为在相乘的过程中子数组要是连续的才可以,中间有正负相间时,不是连续的,所以最大值不是连续的,要从中选择最大的那个值。
1 | class Solution { |
官方动态规划
1 | class Solution { |
时间复杂度O(n),空间复杂度O(n)
优化空间
由于第 i 个状态只和第 i−1 个状态相关,根据「滚动数组」思想,我们可以只用两个变量来维护 i−1 时刻的状态,一个维护 fmax,一个维护fmin
1 |
|
时间复杂度O(n),空间复杂度O(1)
参考文献
作者:LeetCode-Solution
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。