LeetCode 1856. Maximum Subarray Min-Product Solution in Java, C++, Python & More | Explanation + Code

CoderIndeed
0
1856. Maximum Subarray Min-Product

Description

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 modulo 109 + 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] × (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.

PythonJavaC++GoTypeScript
class Solution: def maxSumMinProduct(self, nums: List[int]) -> int: n = len(nums) left = [-1] * n right = [n] * n stk = [] for i, x in enumerate(nums): while stk and nums[stk[-1]] >= x: stk.pop() if stk: left[i] = stk[-1] stk.append(i) stk = [] for i in range(n - 1, -1, -1): while stk and nums[stk[-1]] > nums[i]: stk.pop() if stk: right[i] = stk[-1] stk.append(i) s = list(accumulate(nums, initial=0)) mod = 10**9 + 7 return max((s[right[i]] - s[left[i] + 1]) * x for i, x in enumerate(nums)) % mod(code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !