题目
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
链接:https://leetcode.com/problems/maximum-product-subarray/
Given an integer array nums, find the contiguous subarray within an array (containing at least one number) which has the largest product.
Example:
Input: [2,3,-2,4]
Output: 6
Explanation: [2,3] has the largest product 6.
思路及代码
DP
- 因为可能存在负数,所以需要记录至今为止的最大值和最小值(负数,在之后可能变为更大的正数)
- maxx[i]:包含i在内至今为止最大的乘积
- minn[i]:包含i在内至今为止最小的乘积
- maxx = max(nums[i] * maxx[-1], nums[i] * minn[-1], nums[i])
- minn = min(nums[i] * minn[-1], nums[i] * maxx[-2], nums[i])
class Solution:
def maxProduct(self, nums: List[int]) -> int:
if not nums:
return 0
maxx = [nums[0]]
minn = [nums[0]]
for i in range(1, len(nums)):
maxx.append(max(nums[i] * maxx[-1], nums[i] * minn[-1], nums[i]))
minn.append(min(nums[i] * minn[-1], nums[i] * maxx[-2], nums[i]))
return max(max(maxx), max(minn))
复杂度
T =
O
(
n
)
O(n)
O(n)
S =
O
(
n
)
O(n)
O(n)