给定一个整数数组 arr
,找到 min(b)
的总和,其中 b
的范围为 arr
的每个(连续)子数组。
由于答案可能很大,因此 返回答案模 10^9 + 7
。
示例 1:
输入: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。
示例 2:
输入:arr = [11,81,94,43,3] 输出:444
提示:
1 <= arr.length <= 3 * 104
1 <= arr[i] <= 3 * 104
Related Topics
题解
import java.util.Stack;
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
private int sum = 0;
public int sumSubarrayMins(int[] arr) {
Stack<int[]> stack = new Stack<>();
int tmp = 0;
for (int i = 0; i < arr.length; i++) {
int count = 1;
//边界条件等于的情况,后来的数字如果和前面已经入栈的数字大小相同,拿后来的数字覆盖前面的,
while (!stack.isEmpty() && arr[i] <= stack.peek()[0]){
int[] top = stack.pop();
count += top[1];
tmp -= top[1] * top[0];
}
tmp += arr[i] * count;
sum += tmp ;
stack.push(new int[]{arr[i],count});
if (sum >= 1000000007){
sum -= 1000000007;
}
}
return sum;
}
}
//leetcode submit region end(Prohibit modification and deletion)
发表评论