题解 | #子数组的最小值之和#
子数组的最小值之和
https://www.nowcoder.com/practice/a7401d0dd4ec4071a31fd434e150bcc2
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @return int整型 */ public int sumSubarr(ArrayList<Integer> nums) { int mod = 1000000007; // 题目要求的取余数 int[] dp = new int[nums.size()]; // 用于存储"第i个数为结尾的所有子数组的最小值之和", 共有i+1个子数组以第i个数为末尾 int sum = 0; LinkedList<Integer> stack = new LinkedList<>(); for (int i = 0; i < nums.size(); i++) { while (!stack.isEmpty() && nums.get(stack.peek()) >= nums.get(i)) { stack.pop(); } // j 是前面第一个小于当前数字的数字到当前数字的【距离】, 也是以第i个数为末尾的子数组中第i个数为最小值的子数组的个数 int j = stack.isEmpty() ? i + 1 : i - stack.peek(); // 第i个数为结尾的所有子数组的最小值之和,等于 它自己作为最小值时的所有子数组之和 + 其前面第一个小于它的数为末尾的所有子数组的最小值之和 dp[i] = nums.get(i) * j + (stack.isEmpty() ? 0 : dp[i - j]); stack.push(i); } for (int i = 0; i < nums.size(); i++) { sum = (sum + dp[i]) % mod; } return sum % mod; } }