子数组的最小值之和

给定一个整数数组 arr,找到 min(b) 的总和,其中 b 的范围为 arr 的每个(连续)子数组。
由于答案可能很大,因此 返回答案模 10^9 + 7 。

  • 输入:arr = [3,1,2,4]
    输出:17
    解释:
    子数组为 [3],[1],[2],[4],[3,1],[1,2],[2,4],[3,1,2],[1,2,4],[3,1,2,4]。
    最小值为 3,1,2,4,1,1,2,1,1,1,和为 17。

  • 输入:arr = [11,81,94,43,3]
    输出:444

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var sumSubarrayMins = function(arr) {
let ans = 0;
let len = arr.length;
let stack = [len];
let every = 0;
for(let i=len-1;i>=0;i--){
while(stack.length && arr[stack[stack.length-1]]>arr[i]){
let del = stack.pop();
every-=arr[del]*(stack[stack.length-1]-del);
}
every+=arr[i]*(stack[stack.length-1]-i);
stack.push(i);
//console.log(stack,every);
ans=(ans+every)%1000000007;
}
return ans
};