152-maximum-product-subarray

Try it on leetcode

Description

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.

 

Example 1:

Input: nums = [2,3,-2,4]
Output: 6
Explanation: [2,3] has the largest product 6.

Example 2:

Input: nums = [-2,0,-1]
Output: 0
Explanation: The result cannot be 2, because [-2,-1] is not a subarray.

 

Constraints:

  • 1 <= nums.length <= 2 * 104
  • -10 <= nums[i] <= 10
  • The product of any prefix or suffix of nums is guaranteed to fit in a 32-bit integer.

Solution(Python)

class Solution:
    def maxProduct(self, arr: List[int]) -> int:
        # max positive product
        # ending at the current position
        max_ending_here = arr[0]
        n = len(arr)

        # min negative product ending
        # at the current position
        min_ending_here = arr[0]

        # Initialize overall max product
        max_so_far = arr[0]

        # /* Traverse through the array.
        # the maximum product subarray ending at an index
        # will be the maximum of the element itself,
        # the product of element and max product ending previously
        # and the min product ending previously. */
        for i in range(1, n):
            temp = max(max(arr[i], arr[i] * max_ending_here), arr[i] * min_ending_here)
            min_ending_here = min(min(arr[i], arr[i] * max_ending_here), arr[i] * min_ending_here)
            max_ending_here = temp
            max_so_far = max(max_so_far, max_ending_here)

        return max_so_far