The min-product of an array is equal to the minimum value in the array multiplied by the array's sum.
For example, the array [3,2,5] (minimum value is 2) has a min-product of 2 * (3+2+5) = 2 * 10 = 20.
Given an array of integers nums, return the maximum min-product of any non-empty subarray of nums. Since the answer may be large, return it modulo109 + 7.
Note that the min-product should be maximized before performing the modulo operation. Testcases are generated such that the maximum min-product without modulo will fit in a 64-bit signed integer.
A subarray is a contiguous part of an array.
Example 1:
Input: nums = [1,2,3,2]
Output: 14
Explanation: The maximum min-product is achieved with the subarray [2,3,2] (minimum value is 2).
2 * (2+3+2) = 2 * 7 = 14.
Example 2:
Input: nums = [2,3,3,1,2]
Output: 18
Explanation: The maximum min-product is achieved with the subarray [3,3] (minimum value is 3).
3 * (3+3) = 3 * 6 = 18.
Example 3:
Input: nums = [3,1,5,6,4,2]
Output: 60
Explanation: The maximum min-product is achieved with the subarray [5,6,4] (minimum value is 4).
4 * (5+6+4) = 4 * 15 = 60.
Constraints:
1 <= nums.length <= 105
1 <= nums[i] <= 107
Solutions
Solution 1: Monotonic Stack + Prefix Sum
We can enumerate each element \(nums[i]\) as the minimum value of the subarray, and find the left and right boundaries \(left[i]\) and \(right[i]\) of the subarray. Where \(left[i]\) represents the first position strictly less than \(nums[i]\) on the left side of \(i\), and \(right[i]\) represents the first position less than or equal to \(nums[i]\) on the right side of \(i\).
To conveniently calculate the sum of the subarray, we can preprocess the prefix sum array \(s\), where \(s[i]\) represents the sum of the first \(i\) elements of \(nums\).
Then the minimum product with \(nums[i]\) as the minimum value of the subarray is \(nums[i] \times (s[right[i]] - s[left[i] + 1])\). We can enumerate each element \(nums[i]\), find the minimum product with \(nums[i]\) as the minimum value of the subarray, and then take the maximum value.
The time complexity is \(O(n)\), and the space complexity is \(O(n)\). Where \(n\) is the length of the array \(nums\).