907. 子数组的最小值之和
给定一个整数数组 arr,找到 min(b) 的总和,其中 b 的范围为 arr 的每个(连续)子数组。
由于答案可能很大,因此 返回答案模 10^9 + 7 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/sum-of-subarray-minimums
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
import java.util.*;
class Solution {
private static final int MOD = 1000000007;
public int sumSubarrayMins(int[] arr) {
if (arr == null || arr.length == 0) {
return 0;
}
int[] left = new int[arr.length];
int[] right = new int[arr.length];
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < arr.length; i++) {
while (! stack.isEmpty() && arr[i] < arr[stack.peek()]) {
right[stack.pop()] = i;
}
stack.push(i);
}
while (! stack.isEmpty()) {
right[stack.pop()] = arr.length;
}
for (int i = arr.length - 1; i >= 0; i--) {
while (! stack.isEmpty() && arr[i] <= arr[stack.peek()]) {
left[stack.pop()] = i;
}
stack.push(i);
}
while (! stack.isEmpty()) {
left[stack.pop()] = -1;
}
long ans = 0;
for (int i = 0; i < arr.length; i++) {
int l = i - left[i];
int r = right[i] - i;
ans = (ans + (long) l * r * arr[i]) % MOD;
}
return (int) ans;
}
}
心之所向,素履以往 生如逆旅,一苇以航