单调栈模版型题目(3)

单调栈型题目贡献法

基本模版

这是数组a中的

首先我们要明白什么叫做贡献,在一个数组b={1,3,5}中,连续包含1的连续子数组为{1},{1,3},{1,3,5},一共有三个,这三个数一共能组成6个连续子数组,而其中3个子数组都有1,那么就代表了1的贡献值为3,也就是6*1/2

明白了这个概念我们就好写了,假设a数组中有{1,3,5,4,7},需要求每一个子数组中最小值的和,

我们可以利用上述的贡献法来写,以计算左边界为例,从左到右遍历 arr,同时用某个合适的数据结构维护遍历过的元素,并及时移除无用的元素,这个数据结构就是栈。

  1. 当前遍历到元素 a[i]a[i]

  2. 如果发现 a[i]≤a[j]a[i]≤a[j](其中 a[j]a[j] 是栈顶元素)

  3. 那么对于之后任何比 a[j]a[j] 大的元素 xx,必然也满足 x>a[i]x>a[i]

  4. 由于 a[i]a[i] 比 a[j]a[j] 更靠近后面的元素 xx,所以 a[j]a[j] 将永远不会再被用作边界值

  5. 因此可以直接将 a[j]a[j] 弹出栈(它已经"没有任何作用了")

        这是三次遍历的模版

  1. #include <vector>
    #include <stack>
    using namespace std;class Solution {const int MOD = 1e9 + 7;
    public:int sumSubarrayMins(vector<int>& arr) {int n = arr.size();vector<int> left(n, -1);   // 左边第一个比当前元素小的位置vector<int> right(n, n);    // 右边第一个小于或等于当前元素的位置stack<int> st;// 计算左边界for (int i = 0; i < n; ++i) {while (!st.empty() && arr[st.top()] >= arr[i]) {st.pop();}if (!st.empty()) {left[i] = st.top();}st.push(i);}// 清空栈,准备计算右边界while (!st.empty()) st.pop();// 计算右边界for (int i = n - 1; i >= 0; --i) {while (!st.empty() && arr[st.top()] > arr[i]) {st.pop();}if (!st.empty()) {right[i] = st.top();}st.push(i);}long ans = 0;for (int i = 0; i < n; ++i) {ans += (long)arr[i] * (i - left[i]) * (right[i] - i);ans %= MOD;}return (int)ans;}
    };

    还是一次遍历的模版:
     

    #include <vector>
    #include <stack>
    using namespace std;class Solution {const int MOD = 1e9 + 7;
    public:int sumSubarrayMins(vector<int>& arr) {long ans = 0L;arr.push_back(-1);  // 添加哨兵,确保最终清空栈stack<int> st;st.push(-1);        // 初始化栈底哨兵for (int r = 0; r < arr.size(); ++r) {// 维护单调递增栈while (st.size() > 1 && arr[st.top()] >= arr[r]) {int i = st.top();  // 当前处理的柱子索引st.pop();// 计算贡献值:(i - left_bound) * (right_bound - i) * arr[i]ans += (long) arr[i] * (i - st.top()) * (r - i);ans %= MOD;  // 防止溢出}st.push(r);}arr.pop_back();  // 恢复原数组(可选)return (int) ans;}
    };

典型例题:

907. 子数组的最小值之和 - 力扣(LeetCode)

本文参考了力扣的灵山爱抚茶的题单分享|【算法题单】单调栈(矩形面积/贡献法/最小字典序)- 讨论 - 力扣(LeetCode)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/904785.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/904785.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

日常知识点之随手问题整理(思考单播,组播,广播哪个更省带宽)

新入职的公司在某些场景下无脑使用组播技术&#xff0c;自己突然就意识到一个问题&#xff1a;单播&#xff0c;组播&#xff0c;广播&#xff0c;哪个更省带宽&#xff1f; 有所收获&#xff0c;做点笔记&#xff0c;仅仅是个人理解~ 1&#xff1a;简单理解 单播&#xff1…

R1-Omni

一、Omni概述 Omni 文本视频音频&#xff0c;全模态。 R1Omni 强化学习全模态。 二、Omni举例-humanOmni humanOmni&#xff1a;以人体姿态和人物交互为中心的全模态模型。 visual projector有3个&#xff0c;分别负责人脸标签、姿态检测、人和物交互。有点像moe。text enc…

linux中的日志分割

1.问题背景&#xff0c;nginx日志过大不好删除 [rootlocalhost cron.daily]# cd /lk/nginx/log/ [rootlocalhost log]# ll 总用量 2386188 -rw-r--r--. 1 root root 2078699697 5月 9 13:02 access.log -rw-r--r--. 1 root root 11138 5月 6 10:28 error.log [rootloc…

华为云Flexus+DeepSeek征文|从开通到应用:华为云DeepSeek-V3/R1商用服务深度体验

前言 本文章主要讲述在华为云ModelArts Studio上 开通DeepSeek-V3/R1商用服务的流程&#xff0c;以及开通过程中的经验分享和使用感受帮我更多开发者&#xff0c;在华为云平台快速完成 DeepSeek-V3/R1商用服务的开通以及使用入门注意&#xff1a;避免测试过程中出现部署失败等问…

【机器学习-线性回归-5】多元线性回归:概念、原理与实现详解

线性回归是机器学习中最基础且广泛应用的算法之一&#xff0c;而多元线性回归则是其重要扩展。本文将全面介绍多元线性回归的核心概念、数学原理及多种实现方式&#xff0c;帮助读者深入理解这一强大的预测工具。 1. 多元线性回归概述 1.1 什么是多元线性回归 多元线性回归(…

GOC指令

网络版GoC常见绘图命令说明 &#xff08;V3.8&#xff09; 目录 l 基本画图命令 fd, bk, lt, rt l 设置笔状态命令 c, rgb, size, up, down l 状态命令 show, hide, speed, showXY, wait, pause, cls, clsRec l 增强画图命令 o, oo, e, ee, r, rr l 坐标命令 moveTo, lineTo, g…

Qt获取CPU使用率及内存占用大小

Qt 获取 CPU 使用率及内存占用大小 文章目录 Qt 获取 CPU 使用率及内存占用大小一、简介二、关键函数2.1 获取当前运行程序pid2.2 通过pid获取运行时间2.3 通过pid获取内存大小 三、具体实现五、写在最后 ​ 一、简介 近期在使用软件的过程中发现一个有意思的东西。如下所示&a…

期刊论文写作注意点

下面给出关于期刊写作的几个关键注意点 一、摘要突出创新点 最重要的是论文的摘要&#xff0c;因为在论文送审的时候&#xff0c;编辑如果没有时间&#xff0c;最先看的就是摘要。摘要要写好。如果投的是顶刊&#xff0c;在摘要里面尽量不要写是在什么方法的基础上进行改进之类…

Swagger 3.0 中注解详细示例

Swagger 3.0 提供了丰富的注解来详细描述 API 的请求和响应。以下是一个使用 Operation、Parameter、RequestBody 和 ApiResponse 注解的示例&#xff0c;展示了如何设置请求头、请求参数、路径变量、请求体和响应体。代码中未使用 DTO 对象&#xff0c;而是使用 Map 来传递参数…

切比雪夫不等式专题习题解析

切比雪夫不等式专题习题解析 前言 本文为概率论习题集专栏的切比雪夫不等式专题习题解析,针对习题篇中的10道题目提供详细解答。希望通过这些解析帮助大家深入理解切比雪夫不等式的应用和意义。 一、基础概念题解析 习题1解析: 错误。切比雪夫不等式适用于任何具有有限方…

软件测试的概念

需求的概念 开发模型 测试模型 1. 什么是需求 在多数软件公司&#xff0c;会有两部分需求&#xff0c;⼀部分是⽤⼾需求&#xff0c;⼀部分是软件需求。 1.1 ⽤⼾需求 ⽤⼾需求&#xff1a;可以简单理解为甲⽅提出的需求&#xff0c;如果没有甲⽅&#xff0c;那么就是终端⽤⼾…

前端面试每日三题 - Day 29

这是我为准备前端/全栈开发工程师面试整理的第29天每日三题练习&#xff1a; ✅ 题目1&#xff1a;Web Components技术全景解析 核心三要素 Custom Elements&#xff08;自定义元素&#xff09; class MyButton extends HTMLElement {constructor() {super();this.attachShado…

StreamRL:弹性、可扩展、异构的RLHF架构

StreamRL&#xff1a;弹性、可扩展、异构的RLHF架构 大语言模型&#xff08;LLMs&#xff09;的强化学习&#xff08;RL&#xff09;训练正处于快速发展阶段&#xff0c;但现有架构存在诸多问题。本文介绍的StreamRL框架为解决这些难题而来&#xff0c;它通过独特设计提升了训…

LVGL的核心:lv_timer_handler

文章目录 &#x1f9e0; 一句话总结 LVGL 的运行核心&#xff1a;&#x1f501; 1. while(1) 主循环中的 lv_task_handler()⏱️ 2. lv_timer_handler() 定时器调度核心✅ 并发控制✅ 关键行为流程&#xff1a;&#x1f300; 任务执行逻辑&#xff1a;&#x1f9ee; 计算下一次…

【数据机构】2. 线性表之“顺序表”

- 第 96 篇 - Date: 2025 - 05 - 09 Author: 郑龙浩/仟墨 【数据结构 2】 文章目录 数据结构 - 2 -线性表之“顺序表”1 基本概念2 顺序表(一般为数组)① 基本介绍② 分类 (静态与动态)③ 动态顺序表的实现**test.c文件:****SeqList.h文件:****SeqList.c文件:** 数据结构 - 2 …

101 alpha——8 学习

alpha (-1 * rank(((sum(open, 5) * sum(returns, 5)) - delay((sum(open, 5) * sum(returns, 5)),这里我们操作符都明白&#xff0c;现在来看金融意义 金融意义 里层是这个 (sum(open, 5) * sum(returns, 5)) - delay((sum(open, 5) * sum(returns, 5)), 10 这里是两个相减…

auto推导类型原则

auto 是 C11 引入的类型自动推导关键字&#xff0c;它允许编译器根据表达式的类型来推导变量的确切类型。虽然使用 auto 可以让代码更简洁&#xff0c;但理解它的类型推导规则非常关键&#xff0c;尤其是在涉及指针、引用、const、模板等场景时。 ✅ 一、基本推导原则 auto x …

使用智能表格做FMEDA

一、优点 使用智能表格替代excel做FMEDA具备以下优势&#xff1a; 减少维护成本&#xff08;数据库关联&#xff0c;修改方便&#xff09;便于持续优化&#xff08;失效率分布&#xff0c;失效率模型可重复使用&#xff09;多人同步编写&#xff08;同时操作&#xff0c;同步…

IP协议.

IP 协议是互联网的核心协议&#xff0c;工作在网络层。它给网络中的设备分配唯一的 IP 地址&#xff0c;把上层数据封装成数据包&#xff0c;然后根据目的 IP 地址通过路由器等设备进行转发&#xff0c;实现数据在不同网络间的传输。它还能在必要时对数据包进行分片和重组&…

archlinux 详解系统层面

Arch Linux 深度解析&#xff1a;从设计哲学到系统架构 一、Arch Linux 概述&#xff1a;滚动发行的极客之选 Arch Linux 是一款以 滚动更新&#xff08;Rolling Release&#xff09; 为核心特性的 Linux 发行版&#xff0c;强调 轻量、灵活、高度可定制&#xff0c;旨在让用…