單調棧模版型題目(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
英文地址,請注明出處:http://en.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;旨在讓用…