Given an array of integers arr, find the sum of min(b), where b ranges over every (contiguous) subarray of arr. Since the answer may be large, return the answer modulo109 + 7.
Example 1:
**Input:** arr = [3,1,2,4]
**Output:** 17
**Explanation:**
Subarrays are [3], [1], [2], [4], [3,1], [1,2], [2,4], [3,1,2], [1,2,4], [3,1,2,4].
Minimums are 3, 1, 2, 4, 1, 1, 2, 1, 1, 1.
Sum is 17.
Example 2:
**Input:** arr = [11,81,94,43,3]
**Output:** 444
Constraints:
1 <= arr.length <= 3 * 104
1 <= arr[i] <= 3 * 104
ac: Monotoic queue
class Solution {
public int sumSubarrayMins(int[] arr) {
int[] PLE = new int[arr.length]; // Number of previous larger element
int[] NLE = new int[arr.length]; // Number of next larger element
Deque<Integer> stack = new ArrayDeque<>();
for (int i = 0; i < arr.length; i++) {
while (!stack.isEmpty() && arr[stack.peek()] > arr[i]) {
int largerIndex = stack.pop();
NLE[largerIndex] = i - largerIndex - 1;
}
PLE[i] = stack.isEmpty() ? i : i - stack.peek() - 1;
stack.push(i);
}
// There are remaining elements in stack, e.g. [1,2,3,4,5]
while (!stack.isEmpty()) {
int index = stack.pop();
NLE[index] = arr.length - index - 1;
}
long sum = 0;
long MOD = (long) 1e9 + 7;
for (int i = 0; i < arr.length; i++) {
// See below explanation to calculate number of subarray.
long subarrayCount = (PLE[i] + 1) * (NLE[i] + 1);
sum = (sum + subarrayCount * arr[i]) % MOD;
}
return (int) sum;
}
}
/*
O(N) time, O(N) space.
The number of subarrays with 3 in it will be anything that starts in [L..3] and ends in [3..R]. So we have [L..3] starting positions and [3..R] ending positions.
In other words, we have d1 starting positions and d2 ending positions. So the total number of subarrays is just d1*d2.
For example:
in [9,7,8,3,4,6]
we have 4 choices to start with (9,7,8,3)
we have 3 choices to end with (3,4,6)
So answer is just 4*3.
*/