152. 乘积最大子数组152. 乘积最大子数组152. 乘积最大子数组
已解答
中等
相关标签
相关企业
给你一个整数数组 nums
,请你找出数组中乘积最大的非空连续
子数组
(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
测试用例的答案是一个 32-位 整数。
示例 1:
输入: nums = [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: nums = [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
提示:
1 <= nums.length <= 2 * 104
-10 <= nums[i] <= 10
nums
的任何前缀或后缀的乘积都 保证 是一个 32-位 整数
class Solution(object):def maxProduct(self, nums):""":type nums: List[int]:rtype: int"""n=len(nums)ans=0nums1=nums[::-1]for i in range(0,n-1):nums[i+1]*=nums[i] or 1nums1[i+1]*=nums1[i] or 1return max(max(nums),max(nums1))
本质是空间换时间+贪心
0. 为什么要翻转一次计算
这个例子可以很好的看出,因为是从左到右累乘的,与从右到左的累乘的部分子乘积的大小是有差异的。
1. 全为正数的情况
全为正数就是全部相乘。
负数的情况
最大的子数组相乘一定是连续的。要么是从左到右连续,要么是从右到左连续。这里出现负数之所以还保持是为了防止后面再来一个负数,负数得正就可能出现最大值乘积。有点dp的思想在里面。
2. 出现0的情况
如果出现0时,更新乘积值为1,保证后续的连乘可以继续实现。相当于0的左右断开了
3. 同时出现奇数个负数时和0
碰到0就把0当做1,继续和此时的元素相乘