70 lines
1.8 KiB
Java
70 lines
1.8 KiB
Java
|
//给定一个整数数组 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 栈 数组
|
|||
|
// 👍 227 👎 0
|
|||
|
|
|||
|
package leetcode.editor.cn;
|
|||
|
|
|||
|
import java.util.Stack;
|
|||
|
|
|||
|
//907:子数组的最小值之和
|
|||
|
public class SumOfSubarrayMinimums {
|
|||
|
public static void main(String[] args) {
|
|||
|
//测试代码
|
|||
|
Solution solution = new SumOfSubarrayMinimums().new Solution();
|
|||
|
}
|
|||
|
|
|||
|
//力扣代码
|
|||
|
//leetcode submit region begin(Prohibit modification and deletion)
|
|||
|
class Solution {
|
|||
|
public int sumSubarrayMins(int[] arr) {
|
|||
|
int result = 0;
|
|||
|
int length = arr.length;
|
|||
|
Stack<Integer> stack = new Stack<>();
|
|||
|
for (int i = 0; i <= length; i++) {
|
|||
|
int num = (i == length) ? 0 : arr[i];
|
|||
|
while (!stack.empty() && num < arr[stack.peek()]) {
|
|||
|
int index = stack.pop();
|
|||
|
int left = index - (stack.empty() ? -1 : stack.peek());
|
|||
|
int right = i - index;
|
|||
|
result = (int) ((result + (long) left * right * arr[index]) % (Math.pow(10, 9) + 7));
|
|||
|
}
|
|||
|
stack.push(i);
|
|||
|
}
|
|||
|
|
|||
|
return result;
|
|||
|
}
|
|||
|
}
|
|||
|
//leetcode submit region end(Prohibit modification and deletion)
|
|||
|
|
|||
|
}
|