Program to find maximum subarray min-product in Python


Suppose we have an array nums, we have to find the maximum min-product of each non-empty subarray of nums. Since the answer can be big enough, return it in modulo 10^9+7. The min-product of the array is equal to the minimum value in the array multiplied by the sum of the array. So if we have an array is like [4,3,6] (minimum value is 3) has a min-product of 3*(4+3+6) = 3*13 = 39.

So, if the input is like nums = [2,3,4,3], then the output will be 30 because we can get subarray [3,4,3] for maximizing the result, so 3*(3+4+3) = 3*10 = 30.

To solve this, we will follow these steps −

  • m := 10^9+7

  • stack := a new stack

  • rsum := 0, res := 0

  • insert 0 at the end of nums

  • for each index i and value v in nums, do

    • while stack is not empty and nums[index of top of stack] >= v, do

      • index, val) := top of stack and pop it from stack

      • arrSum:= rsum

      • if stack not empty, then

        • arrSum:= rsum - value of top of stack

      • res:= maximum of res and (nums[index]*arrSum)

    • rsum := rsum + v

    • push (i, rsum) at the end of stack

  • return res mod m

Example

Let us see the following implementation to get better understanding −

def solve(nums):
   m = int(1e9+7)
   stack = []
   rsum = 0
   res = 0

   nums.append(0)

   for i, v in enumerate(nums):
      while stack and nums[stack[-1][0]] >= v:
         index, _ = stack.pop()

         arrSum=rsum

         if stack:
            arrSum=rsum-stack[-1][1]

         res=max(res, nums[index]*arrSum)

      rsum += v
      stack.append((i, rsum))

   return res % m

nums = [2,3,4,3]
print(solve(nums))

Input

[2,3,4,3]

Output

30

Updated on: 08-Oct-2021

186 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements