给定一个整数数组 nums
,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。
示例 1:
输入: [2,3,-2,4,-5,1]
输出: 300
解释: 所有数字相乘。
示例 2:
输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
解释: 最大连乘积的子串必定以某个数字为结尾, 我们只需要 求出 以数组中每个数字结尾的最大子串的积,在max就好。
A = [2,3,-2,4,-5,1]
以A[4]结尾的最大积 = 以A[3]结尾的最小积 × A[4]
以A[1]结尾的最大积 = 以A[0]结尾的最大积 × A[1]
以A[3]结尾的最大积 = A[3]
这说明 求以A[n]结尾的最大积时, 需要以A[n-1]结尾的最大积和最小积,以及A[n]
同理
以A[2]结尾的最小积 = 以A[1]结尾的最大积 × A[2]
以A[3]结尾的最小积 = 以A[2]结尾的最小积 × A[3]
以A[2]结尾的最小积 = A[2]
这说明 求以A[n]结尾的最小积时, 需要以A[n-1]结尾的最大积和最小积,以及A[n]
class Solution(object):
def maxProduct(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if len(nums) == 1:
return nums[0]
result = nums[0]
max_n = nums[0]
min_n = nums[0]
for i in range(1, len(nums)):
temp_max = max_n
temp_min = min_n
max_n = max(nums[i], max(temp_max*nums[i], temp_min*nums[i]))
min_n = min(nums[i], min(temp_min*nums[i], temp_max*nums[i]))
result = max(result, max_n)
return result