Problem
Given an integer array nums, find a contiguous non-empty subarray within the array that has the largest product, and return the product.
The test cases are generated so that the answer will fit in a 32-bit integer.
A subarray is a contiguous subsequence of the array.
Algorithm
Dynamic Programming (DP). Due to positive and negative, the maximum value may be obtained from the minimum value.
- Status 1 : max_ans[i] is the max value that can get from the sub array[0, i+1]
- Status 2 : min_ans[i] is the min value that can get from the sub array[0, i+1]
- Status 1 transfer : max_ans[i] = max(max_ans[i-1] * nums[i], min_ans[i-1] * max_ans[i], nums[i])
- Status 2 transfer : min_ans[i] = min(max_ans[i-1] * nums[i], min_ans[i-1] * max_ans[i], nums[i])
Code
class Solution:
def maxProduct(self, nums: List[int]) -> int:
nLen = len(nums)
max_ans = [nums[0]] * nLen
min_ans = [nums[0]] * nLen
for i in range(1, nLen):
max_ans[i] = nums[i]
if max_ans[i] < min_ans[i-1] * nums[i]:
max_ans[i] = min_ans[i-1] * nums[i]
if max_ans[i] < max_ans[i-1] * nums[i]:
max_ans[i] = max_ans[i-1] * nums[i]
min_ans[i] = nums[i]
if min_ans[i] > min_ans[i-1] * nums[i]:
min_ans[i] = min_ans[i-1] * nums[i]
if min_ans[i] > max_ans[i-1] * nums[i]:
min_ans[i] = max_ans[i-1] * nums[i]
return max(max(min_ans), max(max_ans))