代碼隨想錄第51天|單調棧

42. 接雨水

在這里插入圖片描述
參考

思路1: 暴力解法

  • 找每個柱子的左右高度
  • 超時 O(N^2)
    在這里插入圖片描述

思路2: 雙指針優化
請添加圖片描述

class Solution {
public:int trap(vector<int>& height) {vector<int> lheight(height.size(), 0);vector<int> rheight(height.size(), 0);lheight[0] = height[0];for (int i = 1; i < height.size(); i++) {lheight[i] = max(lheight[i - 1], height[i]);}rheight[height.size() - 1] = height[height.size() - 1];for (int i = height.size() - 2; i >= 0; i--) {rheight[i] = max(rheight[i + 1], height[i]);}int res = 0;for (int i = 0; i < height.size(); i++) {if (i == 0 || i == height.size() - 1) continue;int min_val = min(lheight[i], rheight[i]);if (min_val - height[i] > 0) res += min_val - height[i];}return res;}
};

思路3: 單調棧
請添加圖片描述

class Solution {
public:int trap(vector<int>& height) {int res = 0;stack<int> mystack;mystack.push(0);for (int i = 1; i < height.size(); i++) {if (height[i] < height[mystack.top()]) {mystack.push(i);} else if (height[i] == height[mystack.top()]) {mystack.push(i);} else {while (!mystack.empty() && height[i] >= height[mystack.top()]) {int right = i;int mid = mystack.top();mystack.pop();if (mystack.empty()) break;//元素數量不滿足時, 無需回退上一步的pop操作, 放心舍棄元素(構不成封閉區間)int left = mystack.top();int w = right - left - 1;res += (min(height[left], height[right]) - height[mid]) * w;}mystack.push(i);}}return res;}
};
//對比: 細節處理存在問題, 雖然能通過, 實際上并不是單調棧(首元素的影響)
while (mystack.size() > 1 && height[i] >= height[mystack.top()]) {int right = i;int mid = mystack.top();mystack.pop();int left = mystack.top();int w = right - left - 1;if (min(height[left], height[right]) - height[mid] > 0)res += (min(height[left], height[right]) - height[mid]) * w;
}

在這里插入圖片描述


84.柱狀圖中最大的矩形

在這里插入圖片描述

思路: 單調棧
和接雨水相似, 區別在棧內元素輕的沉底
首插入0避免出現棧內元素不滿足2的情況(如 3 1 2)
尾插入0避免出現一直滿足棧條件而無法收獲結果的情況(如 2 3 4 5)
請添加圖片描述

class Solution {
public:int largestRectangleArea(vector<int>& heights) {heights.insert(heights.begin(), 0);heights.push_back(0);stack<int> mystask;mystask.push(0);int res = 0;for (int i = 1; i < heights.size(); i++) {if (heights[i] > heights[mystask.top()]) {mystask.push(i);} else if (heights[i] == heights[mystask.top()]) {mystask.push(i);} else {while (!mystask.empty() &&heights[i] < heights[mystask.top()]) {int right = i;int mid = mystask.top();mystask.pop();if (!mystask.empty()) {int left = mystask.top();int tem = (right - left - 1) * heights[mid];res = max(res, tem);}}mystask.push(i);}}return res;}
};

思路: 雙指針
實現方式不同, 此處存放的是下標索引

請添加圖片描述

class Solution {
public:int largestRectangleArea(vector<int>& heights) {int res = 0;vector<int> L_index(heights.size());vector<int> R_index(heights.size());for (int i = 0; i < heights.size(); i++) {int t = i;while (t > 0 && heights[t - 1] >= heights[i]) t = L_index[t - 1];//若改為 t--則會超時L_index[i] = t;}for (int i = heights.size() - 1; i >= 0; i--) {int t = i;while (t + 1 < heights.size() && heights[i] <= heights[t + 1]) t = R_index[t + 1];R_index[i] = t;}for (int i = 0; i < heights.size(); i++) {int W = R_index[i] - L_index[i] + 1;int tem = W * heights[i];res = max(res, tem);}return res;}
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/web/45001.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45001.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45001.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

nginx的正向與反向代理

正向代理與反向代理的區別 雖然正向代理和反向代理都涉及代理服務器接收客戶端請求并向服務端轉發請求&#xff0c;但它們之間存在一些關鍵的區別&#xff1a; 正向代理&#xff1a; 在正向代理中&#xff0c;代理服務器代表客戶端向服務器發送請求&#xff0c;并將服務…

ctfshow-web入門-php特性(web104-web108)

目錄 1、web104 2、web105 3、web106 4、web107 5、web108 1、web104 需要傳入的 v1 和 v2 進行 sha1 加密后相等。 解法1&#xff1a; 這里都沒有判斷 v1 和 v2 是否相等&#xff0c;我們直接傳入同樣的內容加密后肯定也一樣。 ?v21 post&#xff1a; v11 拿到 flag…

SQL 多變關聯使用子查詢去重

不去重狀態 select a.*,b.recon_amt from free_settlement_first aleft join free_settlement_second b on a.settlement_first_id b.settlement_first_id 有2條數據出現了重復 使用子查詢去重 select a.*,b.recon_amt from free_settlement_first aleft join free_settlem…

Vue 最新動態!!!

大家好,我是CodeQi! 一位熱衷于技術分享的碼仔。 當Vue 3.4在六個月前發布時,整個前端開發社區都為之振奮。這次更新不僅帶來了許多新特性,還解決了許多開發過程中遇到的痛點。 然而,時間飛逝,隨著我在項目中不斷應用這些新特性,逐漸積累了很多寶貴的經驗和心得。 今…

一篇學通Axios

Axios 是一個基于 Promise 的 HTTP 客戶端&#xff0c;用于瀏覽器和 node.js 環境。它提供了一種簡單易用的方式來發送 HTTP 請求&#xff0c;并支持諸如請求和響應攔截、轉換數據、取消請求以及自動轉換 JSON 數據等功能。 Axios 名字的由來 Axios 的名字來源于希臘神話中的…

Linux操作系統入門(適用java軟件開發)

1.什么是操作系統? 操作系統&#xff08;Operating System&#xff0c;簡稱 OS&#xff09;是一種系統軟件&#xff0c;它管理和控制計算機硬件與軟件資源&#xff0c;為用戶和應用程序提供一個接口和環境來訪問計算機系統的服務和功能。操作系統的主要目標是提供一個方便、有…

探索性數據分析:使用Python與Pandas庫實現數據洞察

探索性數據分析&#xff1a;使用Python與Pandas庫實現數據洞察 引言 在當今數據驅動的時代&#xff0c;數據分析已成為決策制定、策略規劃和業務優化的關鍵環節。無論是商業智能、金融分析還是市場研究&#xff0c;數據分析都扮演著至關重要的角色。Pandas庫作為Python生態系統…

微積分-導數8(線性近似和微分)

線性近似 我們已經看到&#xff0c;在切點附近&#xff0c;曲線與其切線非常接近。事實上&#xff0c;通過放大可微函數圖上的某一點&#xff0c;我們注意到圖形看起來越來越像它的切線&#xff08;見圖&#xff09;。這一觀察是找到函數近似值的方法的基礎。 這個想法是&am…

Java [ 進階 ] JVM雙親委派機制?

目錄 ?探索Java進階 雙親委派機制? 理解 Java 的雙親委派機制 什么是雙親委派機制&#xff1f; 類加載器的層次結構 雙親委派機制的工作原理 優缺點分析 優點 缺點 一些面試題目&#xff1a; 什么是雙親委派機制&#xff1f; 雙親委派機制的工作流程是怎樣的&am…

monodepth代碼與原理對照實現

先實現demomonodepth/monodepth_simple.py at master mrharicot/monodepth GitHub import os os.environ[TF_CPP_MIN_LOG_LEVEL]0 這行代碼是為tensorflow設置環境變量TF_CPP_MIN_LOG_LEVEL,用來控制tensorflow c后端輸出的日志級別。0就是輸出所有級別的日志信息。包括(調…

vue2學習筆記3 - 開發環境知識補充:live server簡介

學習筆記1搭建開發環境中&#xff0c;在vs code里安裝了live server插件&#xff0c;后續多次使用open with live server來打開瀏覽器&#xff0c;展示代碼運行效果。本著知其然也要知其所以然的態度&#xff0c;稍稍了解了一下Live server。 什么是Live Server Live Server是…

探索Conda的依賴迷宮:包依賴樹的構建與解析

探索Conda的依賴迷宮&#xff1a;包依賴樹的構建與解析 引言 在復雜的軟件項目中&#xff0c;依賴管理是確保軟件正常運行的關鍵。Conda作為流行的Python包管理器&#xff0c;提供了強大的依賴樹功能&#xff0c;幫助用戶理解和管理包依賴關系。本文將詳細介紹如何在Conda中使…

個性化你的編碼世界:深度定制PyCharm主題與字體

個性化你的編碼世界&#xff1a;深度定制PyCharm主題與字體 引言 在編碼的旅途中&#xff0c;一個舒適且個性化的環境能夠顯著提升開發體驗。PyCharm作為業界領先的集成開發環境&#xff08;IDE&#xff09;&#xff0c;提供了豐富的定制選項&#xff0c;允許用戶根據個人喜好…

力扣--20. 有效的括號

目錄 題目 思路 注意 題目 給定一個只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判斷字符串是否有效。 有效字符串需滿足&#xff1a; 左括號必須用相同類型的右括號閉合。左括號必須以正確的順序閉合。每個右括…

DP討論——適配器模式

學而時習之&#xff0c;溫故而知新。 敵人出招&#xff08;使用場景&#xff09; 說是自己的程序對接第三方的庫&#xff0c;但是自己的代碼的接口設計完畢了&#xff0c;如何對接上&#xff1f; 你出招 適配器模式就是為此而生的——我覺得應該是該解決方法被命名為了適配…

滯后序列分析案例詳解

一個半小時 超出30分鐘 日期&#xff1a;2024-07-13 19:14:33 回放 摘要 Python在行為分析中的應用 主要講述了如何使用Python處理序列數據&#xff0c;以及如何結合定性分析和定量分析來全面分析課程內容。講者提到了一種叫做分層法的分類方法&#xff0c;該方法使用了布魯…

ArcGIS Pro SDK (九)幾何 2 坐標

ArcGIS Pro SDK &#xff08;九&#xff09;幾何 2 坐標 文章目錄 ArcGIS Pro SDK &#xff08;九&#xff09;幾何 2 坐標1 矢量極坐標2 獲取矢量傾角3 獲取矢量方位角4 向量運算5 2D 矢量操作6 生成器 環境&#xff1a;Visual Studio 2022 .NET6 ArcGIS Pro SDK 3.0 1 矢量…

知識圖譜數據庫基本知識

文章目錄 知識圖譜數據模型知識圖譜查詢語言隨著知識圖譜規模的日益增長,數據管理愈加重要。一方面,以文件形式保存的知識圖譜顯然無法滿足用戶的查詢、檢索、推理、分析及各種應用需求;另一方面,傳統數據庫的關系模型與知識圖譜的圖模型之間存在顯著差異,關系數據庫無法有…

ctfshow-web入門-php特性(web96-web99)

目錄 1、web96 2、web97 3、web98 4、web99 1、web96 試了下通配、轉義、拼接、大小寫都不行 這里使用絕對路徑或者當前路徑繞過&#xff1a; ?u./flag.php ?u/var/www/html/flag.php 還可以使用 php 偽協議&#xff1a; ?uphp://filter/resourceflag.php 2、web97 關…

數據結構(Java):力扣Stack集合OJ題

1、括號匹配問題 . - 力扣&#xff08;LeetCode&#xff09; 1.1 思路分析 根據棧的先進后出原則&#xff0c;我們可以這樣解決問題&#xff1a; 遍歷字符串&#xff0c;遇見左括號就將左括號push入棧&#xff1b;遇見右括號就pop出棧&#xff0c;將出棧的元素和該右括號比較…