Maximum Product Subarray

# Given an integer array nums, find a contiguous non-empty subarray within the array that has the largest product, and return the product.
# It is guaranteed 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.

# Dynamic Programming Approach (Kadane's Algorithm) - O(n) Time / O(1) Space
# Track both current minimum and current maximum (Due to possibility of multiple negative numbers)
# Answer is the highest value of current maximum

# @param {Integer[]} nums
# @return {Integer}
def max_product(nums)
  return nums[0] if nums.length == 1

  cur_min = 1
  cur_max = 1
  max = -11

  nums.each do |val|
    tmp_cur_max = cur_max
    cur_max = [val, val * cur_max, val * cur_min].max
    cur_min = [val, val * tmp_cur_max, val * cur_min].min

    max = [max, cur_max].max
  end

  max
end

nums = [2, 3, -2, 4]
puts max_product(nums)
# Output: 6

nums = [-2, 0, -1]
puts max_product(nums)
# Output: 0
Algerlogo

Β© Alger 2022

About us

We are a group of programmers helping each other build new things, whether it be writing complex encryption programs, or simple ciphers. Our goal is to work together to document and model beautiful, helpful and interesting algorithms using code. We are an open-source community - anyone can contribute. We check each other's work, communicate and collaborate to solve problems. We strive to be welcoming, respectful, yet make sure that our code follows the latest programming guidelines.