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;
    }
}
posted @ 2023-03-21 00:17  Tianyiya  阅读(28)  评论(0)    收藏  举报