【LeetCode 42】接雨水(單調棧、DP、雙指針)

題面:

在這里插入圖片描述

思路:

能接雨水的點,必然是比兩邊都低(小)的點。有兩種思路,一種是直接計算每個點的最大貢獻(也就是每個點在縱向上最多能接多少水),另一種就是計算每個點在橫向上有沒有貢獻。
第一種思路,就需要我們能拿到每個點左右兩邊最高的高度,這樣就能計算每個點在縱向上能接多少水,相當于木桶效應。
第二種思路,對于每個點,則需要判斷它左右兩邊是不是都有比它高的點,每次計算橫向上局部能接到水的區域。
官方題解挺好的,具體不再贅述

1. 單調棧

就是第二種思路,每次更新橫向上能接到的水。

int trap(vector<int>& height) {int ans = 0, n = (int)height.size();stack<int> stk;for(int i = 0; i < n; ++ i) {while(!stk.empty() && height[i] > height[stk.top()]) {// 得到當前低點int buttom = stk.top(); stk.pop();if(!stk.empty()) {int j = stk.top();// 如果 height[j] == height[bottom]// 就說明 bottom 的左邊還沒有出現凸出來讓bottom能接到水的邊邊ans += (i - j - 1) * (min(height[i], height[j]) - height[buttom]);}}stk.push(i);}return ans;
}

2. 動態規劃

第一種思路,要拿到每個點左右兩邊的最大高度,就可以考慮線性DP的思想去記錄當前點左右兩邊的最大高度。
l e f t M a x [ i ] = m a x ( l e f t M a x [ i ? 1 ] , h e i g h t [ i ] ) r i g h t M a x [ i ] = m a x ( r i g h t M a x [ i + 1 ] , h e i g h t [ i ] ) g o t W a t e r [ i ] = m i n ( l e f t M a x [ i ] , r i g h t M a x [ i ] ) ? h e i g h t [ i ] leftMax[i]=max(leftMax[i-1],height[i])\\ rightMax[i]=max(rightMax[i+1],height[i])\\ gotWater[i] = min(leftMax[i],\ rightMax[i])-height[i] leftMax[i]=max(leftMax[i?1],height[i])rightMax[i]=max(rightMax[i+1],height[i])gotWater[i]=min(leftMax[i],?rightMax[i])?height[i]

int trap(vector<int>& height) {int ans = 0, n = (int)height.size();vector<int> leftMax(n), rightMax(n);leftMax[0] = height[0]; rightMax[n - 1] = height[n - 1];for(int i = 1; i < n; ++ i) leftMax[i] = max(leftMax[i - 1], height[i]);for(int i = n - 2; i >= 0; -- i) rightMax[i] = max(rightMax[i + 1], height[i]);for(int i = 1; i < n - 1; ++ i)ans += min(leftMax[i], rightMax[i]) - height[i];return ans;
}

雙指針

使用雙指針和臨時變量優化掉 l e f t M a x leftMax leftMax r i g h t M a x rightMax rightMax 兩個數組。
官方題解說:如果 h e i g h t [ l e f t ] < h e i g h t [ r i g h t ] height[left]<height[right] height[left]<height[right],則必有 l e f t M a x < r i g h t M a x leftMax<rightMax leftMax<rightMax
這主要是因為,我們每次移動的都是 h e i g h t height height 較小的指針,因此如果 l e f t M a x leftMax leftMax r i g h t M a x rightMax rightMax 有更新,則更新了的點 l e f t left left r i g h t right right l e f t M a x leftMax leftMax r i g h t M a x rightMax rightMax 得到新的更新之前會停留一陣子。因此如果 h e i g h t [ l e f t ] < h e i g h t [ r i g h t ] height[left]<height[right] height[left]<height[right],則必有 l e f t M a x < r i g h t M a x leftMax<rightMax leftMax<rightMax

int trap(vector<int>& height) {int ans = 0, n = (int)height.size();int left = 0, right = n - 1;int leftMax = height[0], rightMax = height[n - 1];while(left < right) {leftMax = max(leftMax, height[left]);rightMax = max(rightMax, height[right]);if(height[left] < height[right])ans += min(leftMax, rightMax) - height[left ++];elseans += min(leftMax, rightMax) - height[right --];}return ans;
}

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

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

相關文章

【嵌入式開發-USB】

嵌入式開發-USB ■ USB簡介 ■ USB簡介

Visual Studio 項目轉Qt項目

1. 先確保qmake 和 minGW &#xff08;g&#xff09; 路徑都在系統變量內&#xff1b;或者通過WinR -> cmd 來檢測&#xff0c; 如果能夠 顯示qmake 的信息 &#xff0c; g 的信息 &#xff0c; 就說明設置環境變量成功。 2. 打開項目文件夾&#xff0c;在這里打開cmd, 換…

總線通信篇:I2C、SPI、CAN 的底層結構與多機通信設計

本文為嵌入式通信協議系列第三章,深入剖析 MCU 世界中的三大總線協議 —— I2C、SPI 和 CAN。 這些總線協議廣泛應用于傳感器數據采集、Flash 存儲、外設擴展、汽車電子、工業設備控制等領域,是嵌入式開發不可或缺的通信骨架。 ?? 一、總線通信的基本概念 1.1 什么是總線?…

sherpa:介紹

更多內容&#xff1a;XiaoJ的知識星球 目錄 1. sherpa 介紹 1. sherpa 介紹 sherpa是 Next-gen Kaldi 項目的部署框架。 sherpa 支持在各種平臺上部署與語音相關的預訓練模型&#xff0c;并提供多種語言綁定。 目前&#xff0c;sherpa 擁有以下子項目&#xff1a; k2-fsa/sh…

77.組合問題

主函數 combine def combine(self, n: int, k: int) -> List[List[int]]:result [] # 存放所有有效的組合self.backtracking(n, k, 1, [], result) # 從數字1開始搜索return result 作用&#xff1a;初始化并啟動回溯過程。參數&#xff1a; n4&#xff1a;數字范圍是1…

Oracle免費認證來襲

1、Oracle Cloud Infrastructure 2025 Foundations Associate” &#x1f517; 考證地址&#xff1a;https://mylearn.oracle.com/ou/exam-unproctored/oracle-cloud-infrastructure-2025-foundations-associate-1z0-1085-25/148056/241954 2、Oracle Cloud Infrastructure 2…

【Unet++】

這是一篇關于語義分割U-net及其變體網絡結構的介紹性文章&#xff0c;主要介紹了U-net、U-net以及U-net的基本結構、特點和應用。 以下是對這些核心內容的簡要概述&#xff1a; 1. 語義分割U-net概述: - 基本結構&#xff1a;U-net是一種編碼解碼結構的網絡&#xff0c;起初…

git可視化工具Fork軟件的詳細使用教程

Fork是一款流行的Git圖形化客戶端&#xff0c;適用于Windows和macOS平臺。使用起來確實很方便&#xff0c;唯一的缺陷就是正版需要付費使用&#xff01; Fork 安裝 官網下載地址&#xff1a;Fork官網地址https://git-fork.com/ 支持 macOS 和 Windows。 安裝完成后&#xff…

【JMeter技巧】GET請求如何傳遞Body參數?版本兼容性詳解場景需求

在實際接口測試中&#xff0c;有時會遇到特殊需求&#xff1a;需要給GET請求傳遞Body參數。但JMeter默認配置下&#xff0c;GET請求的Body數據會被自動忽略。本文將介紹如何通過配置解決這個問題。 配置步驟 1. 版本要求&#xff08;重要&#xff01;&#xff09; JMeter ≥ …

HTML5好看的水果蔬菜在線商城網站源碼系列模板9

文章目錄 1.設計來源1.1 主界面1.2 商品界面1.3 購物車界面1.4 心愿列表界面1.5 商品信息界面1.6 博客界面1.7 關于我們界面1.8 聯系我們界面1.9 常見問題界面1.10 登錄界面 2.效果和源碼2.1 動態效果2.2 源代碼 源碼下載萬套模板&#xff0c;程序開發&#xff0c;在線開發&…

es 里的Filesystem Cache 理解

文章目錄 背景問題1&#xff0c;Filesystem Cache 里放的是啥問題2&#xff0c;哪些查詢它們會受益于文件系統緩存問題3 查詢分析 背景 對于es 優化來說常常看到會有一條結論給&#xff0c;給 JVM Heap 最多不超過物理內存的 50%&#xff0c;且不要超過 31GB&#xff08;避免壓…

存儲器:DDR和獨立顯卡的GDDR有什么區別?

本文來簡要對比DDR&#xff08;Double Data Rate SDRAM&#xff09;和GDDR&#xff08;Graphics Double Data Rate SDRAM&#xff09;的區別&#xff0c;重點說明它們在設計、性能和應用上的差異&#xff1a; 1. 設計目標與架構 DDR&#xff1a;通用型DRAM&#xff0c;設計為…

【Electron】electron-vue 借助 element-ui UI 庫助力桌面應用開發

前面文章我們講過 electron 讓可以用 HTML、JS、CSS 開發桌面應用程序。而 electron-vue 是一個結合了 electron 與 vue 的套件。這樣我們就能方便地使用 vue 快速開發桌面應用。但是&#xff0c;vue 只是在 js 這層面做了大量的便捷的操作。對 UI 并未過多涉及。此時如果您在開…

Linux/AndroidOS中進程間的通信線程間的同步 - 消息隊列

本文介紹消息隊列&#xff0c;它允許進程之間以消息的形式交換數據。數據的交換單位是整個消息。 POSIX 消息隊列是引用計數的。只有當所有當前使用隊列的進程都關閉了隊列之后才會對隊列進行標記以便刪除。POSIX 消息有一個關聯的優先級&#xff0c;并且消息之間是嚴格按照優…

深入理解進程與線程、進程池與線程池:企業級開發實戰指南

簡介 并發編程是現代軟件開發的核心能力,而進程與線程、進程池與線程池是實現高效并發的關鍵技術。 本文將從基礎概念出發,深入解析它們的工作原理、優勢及適用場景,并提供Python、Java、C#等主流語言的實戰代碼,幫助開發者掌握企業級并發編程的最佳實踐。 一、進程與線程…

解鎖 LLM 推理速度:深入 FlashAttention 與 PagedAttention 的原理與實踐

寫在前面 大型語言模型 (LLM) 已經滲透到我們數字生活的方方面面,從智能問答、內容創作到代碼輔助,其能力令人驚嘆。然而,驅動這些強大模型的背后,是對計算資源(尤其是 GPU)的巨大需求。在模型推理 (Inference) 階段,即模型實際對外提供服務的階段,速度 (Latency) 和吞…

Go使用Gin寫一個對MySQL的增刪改查服務

首先用SQL創建一個包含id、name屬性的users表 create table users (id int auto_incrementprimary key,name varchar(255) null );查詢所有用戶信息&#xff1a; func queryData(db *sql.DB, w http.ResponseWriter) {rows, err : db.Query("SELECT * FROM users"…

鍵盤彈起導致頁面上移

問題&#xff1a;聊天頁面&#xff0c;如果輸入框設置了adjust-position屬性為true&#xff0c;會導致鍵盤彈起時&#xff0c;整個頁面上移&#xff0c;頂部導航欄也會跟著上移。 我想要的效果&#xff1a;鍵盤彈起時&#xff0c;頁面內容上移&#xff0c;頂部導航欄保持不動 …

機器視覺的手機FPC油墨絲印應用

在現代智能手機制造過程中&#xff0c;精密的組件裝配和質量控制是確保產品性能和用戶體驗的關鍵。其中&#xff0c;柔性印刷電路板&#xff08;FPC&#xff09;的油墨絲印工藝尤為關鍵&#xff0c;它不僅影響到電路板的美觀&#xff0c;更直接關系到電路的導電性能和可靠性。而…

ChromeDriverManager的具體用法

ChromeDriverManager 是 webdriver_manager 庫的一部分&#xff0c;它用于自動管理 ChromeDriver 的下載和更新。使用 ChromeDriverManager 可以避免手動下載 ChromeDriver 并匹配系統中安裝的 Chrome 瀏覽器版本。以下是 ChromeDriverManager 的基本用法&#xff1a; 步驟 1…