Sum of Subarray Ranges
Description:
You are given an integer array nums. The range of a subarray of nums is the difference between the largest and smallest element in the subarray.
Return the sum of all subarray ranges of nums.
A subarray is a contiguous non-empty sequence of elements within an array.
Example 1:
Input: nums = [1,2,3]
Output: 4
Explanation: The 6 subarrays of nums are the following:
[1], range = largest - smallest = 1 - 1 = 0
[2], range = 2 - 2 = 0
[3], range = 3 - 3 = 0
[1,2], range = 2 - 1 = 1
[2,3], range = 3 - 2 = 1
[1,2,3], range = 3 - 1 = 2
So the sum of all ranges is 0 + 0 + 0 + 1 + 1 + 2 = 4.
Example 2:
Input: nums = [1,3,3]
Output: 4
Explanation: The 6 subarrays of nums are the following:
[1], range = largest - smallest = 1 - 1 = 0
[3], range = 3 - 3 = 0
[3], range = 3 - 3 = 0
[1,3], range = 3 - 1 = 2
[3,3], range = 3 - 3 = 0
[1,3,3], range = 3 - 1 = 2
So the sum of all ranges is 0 + 0 + 0 + 2 + 0 + 2 = 4.
Video Explanation

Approaches:
1. Monotonic Stack
The problem asks for the sum of all subarray ranges. We can optimize this using a Monotonic Stack by realizing that:
To find these sums efficiently, we need to determine how many subarrays a specific element acts as the maximum, and how many it acts as the minimum.
- For the Minimums: We use a monotonically increasing stack to find the Previous Smaller Element and Next Smaller Element.
- For the Maximums: We use a monotonically decreasing stack to find the Previous Greater Element and Next Greater Element.
- Handling Duplicates: To avoid double-counting subarrays when there are duplicate numbers, we use a strict inequality
<on one side and a non-strict inequality<=on the other.
- Time Complexity: because we iterate through the array a constant number of times. Each element is pushed and popped from the stack exactly once.
- Space Complexity: to store elements in the stack. In the worst-case scenario, the stack will store elements.