当前位置: 首页 > article >正文

【单调栈】子数组的最小值之和


import java.util.Deque;
import java.util.LinkedList;

/** 参考链接:https://leetcode.cn/problems/sum-of-subarray-minimums/solutions/1930857/gong-xian-fa-dan-diao-zhan-san-chong-shi-gxa5/
 *           https://leetcode.cn/problems/sum-of-subarray-minimums/solutions/1931139/-by-muse-77-367z/
 * 单调栈
 *  思路:将求取每个连续的子数组的最小值之和,转换为求:以每个数为最小值然后求以该数
 *        为最小值子数组的个数,然后个数乘以该最小值得到的数加到结果集中。重复这样的
 *        操作遍历全部的数。
 *
 *  问题:如何找到以该数为最小值的数组个数。
 *  想要解决这个问题,需要明白 乘法原理: 最小值左边的数乘以右边的数等于该数全部的连续子序列的个数
 *
 *       栈中存储的全部是下标,但数值是从栈底到栈顶是单调递增的。
 *
 *
 * @auther start
 * @create 2023-11-26 21:35
 */
public class L907 {

    private static final long MOD = (long) 1e9 + 7;
    public int sumSubarrayMins(int[] arr) {
        long ans = 0;
        Deque<Integer> st = new LinkedList<>();
        st.push(-1);
        for (int r = 0; r <= arr.length; r++) {
            int x = r < arr.length ? arr[r] : -1;
            // x 小于栈顶元素,栈顶元素出栈,新的栈顶元素是该元素的
            // 左边界,r是该元素的有边界。
            while (st.size() > 1 && arr[st.peek()] >= x) {
                int i = st.pop();
                //将该最小值组成的元素个数乘以该最小值的结果添加到结果集中。
                ans += (long) arr[i] * (i - st.peek()) * (r - i);
            }
            st.push(r);
        }
        //输出结果
        return (int) (ans % MOD);
    }
}


http://www.kler.cn/a/145633.html

相关文章:

  • DDD实战课 笔记
  • 实战经验:使用 Python 的 PyPDF 进行 PDF 操作
  • linux下使用脚本实现对进程的内存占用自动化监测
  • C++ 二叉搜索树
  • Plotly 函数图像绘制
  • Spring MVC和Spring WebFlux的区别
  • Presto+Alluxio数据平台实战
  • IDM(Internet Download Manager)PC版提升下载速度与效率的利器
  • uniapp+vue基于Android的校园二手跳蚤市场的设计与实现 微信小程序
  • 18.天气小案例
  • 电子学会C/C++编程等级考试2021年06月(三级)真题解析
  • SELinux零知识学习三十、SELinux策略语言之角色和用户(1)
  • 常见遍历方法 for循环、forEach、map、filter、find、findIndex、some、every
  • 1 Python实现23种计模式
  • qt双击treeview节点之后,完成编辑,获取完成编辑得信号
  • C++变量、函数、类的声明和定义
  • leetCode 1080.根到叶路径上的不足节点 + 递归 + 图解
  • LeetCode Hot100 105.从前序与中序遍历序列构造二叉树
  • 鸿蒙(HarmonyOS)应用开发——基础语法例子
  • Vuejs+ElementUI搭建后台管理系统框架
  • 我在Vscode学OpenCV 几何变换(缩放、翻转、仿射变换、透视、重映射)
  • 小黑子—Maven高级
  • 使用Rust开发小游戏
  • 【图论】关键路径求法c++
  • 运用工具Postman快速导出python接口测试脚本
  • Unity - Graphic解析