接雨水的算法

題目

在這里插入圖片描述

代碼

# 接雨水算法
def trap(height):# 1. 特殊情況:數組為空 則返回0if not height:return 0n = len(height)# 2. 初始化左右指針,左右最大值,結果left, right = 0, n - 1# maxleft代表左邊最大值,maxright代表右邊最大值maxleft, maxright = height[0], height[n - 1]# ans代表結果ans = 0# 左右指針相遇時結束while left <= right:# 更新左右最大值maxleft = max(height[left], maxleft)maxright = max(height[right], maxright)# 判斷左右最大值,小的一邊進行計算# 雨滴的高度為左右最大值中的小值減去當前高度if maxleft < maxright:ans += maxleft - height[left]left += 1else:ans += maxright - height[right]right -= 1return ans# 計算數據 height = [0,1,0,2,1,0,1,3,2,1,2,1]
height = [0,1,0,2,1,0,1,3,2,1,2,1]
print(trap(height))  # 6

思路

中文解釋

  1. 特殊情況處理:如果輸入的高度數組為空,則返回0。
  2. 初始化:定義左右指針leftright,分別指向數組的兩端。定義maxleftmaxright,分別表示左邊和右邊的最大值。定義ans用于存儲結果。
  3. 循環計算:當左右指針沒有相遇時,進行以下操作:
    • 更新maxleftmaxright,分別為當前指針位置的高度和之前最大值中的較大者。
    • 比較maxleftmaxright,選擇較小的一邊進行計算:
      • 如果maxleft較小,則計算左邊的雨水高度,并將左指針右移。
      • 否則,計算右邊的雨水高度,并將右指針左移。
  4. 返回結果:循環結束后,返回計算得到的雨水總量ans

圖示

以下是一個示例圖示,展示了算法的工作原理:

高度數組: [0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]初始狀態:
left -> 0
right -> 11
maxleft -> 0
maxright -> 1
ans -> 0每一步的狀態變化:
1. left -> 1, maxleft -> 1, ans -> 0
2. right -> 10, maxright -> 2, ans -> 0
3. left -> 2, maxleft -> 1, ans -> 1
4. left -> 3, maxleft -> 2, ans -> 1
5. right -> 9, maxright -> 2, ans -> 2
6. right -> 8, maxright -> 2, ans -> 2
7. right -> 7, maxright -> 3, ans -> 2
8. left -> 4, maxleft -> 2, ans -> 2
9. left -> 5, maxleft -> 2, ans -> 4
10. left -> 6, maxleft -> 2, ans -> 5
11. left -> 7, maxleft -> 3, ans -> 6最終結果: 6

通過上述步驟,算法計算出總共可以接住6個單位的雨水。

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

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

相關文章

會話對象 HttpSession 二、HttpSession失效

session失效有如下幾個原因&#xff1a; session.invalidate()方法注銷sessionsession超時 <session-config><!-- session的超時時間&#xff0c;以分鐘為單位 --><session-timeout>1</session-timeout> </session-config>Cookie被禁用

Jenkins 創建 Node 到 Windows

Jenkins 創建 Node 到 Windows 一. 新建 Node Dashboard -> Manage Jenkins -> Manage Nodes and Clouds Dashboard -> Nodes -> New Node 二. 配置節點 Node&#xff1a;節點名 Description&#xff1a;節點描述 Number of executors&#xff1a;節點最大同…

Opengl常用緩沖對象功能介紹及使用示例(C++實現)

本文整理了常用的opengl緩沖區對象并安排了使用示例 名稱英文全稱作用簡述頂點數組對象Vertex Array Object (VAO)管理 VBO 和 EBO 的配置&#xff0c;存儲頂點屬性設置&#xff0c;簡化渲染流程&#xff0c;避免重復設置狀態頂點緩沖區對象Vertex Buffer Object (VBO)存儲頂點…

矩陣加減乘除的意義與應用

矩陣加法 數學意義 線性空間的封閉性線性變換的疊加矩陣分解與表示 實際應用 數據聚合與統計圖像處理與計算機視覺物理學與工程學動態系統與優化經濟學與運籌學信號處理與通信游戲開發與計算機圖形學環境科學與地理信息矩陣加法的關鍵特點 矩陣減法 數學意義線性空間封閉性 線…

【Redis原理】底層數據結構 五種數據類型

文章目錄 動態字符串SDS(simple dynamic string )SDS結構定義SDS動態擴容 IntSetIntSet 結構定義IntSet的升級 DictDict結構定義Dict的擴容Dict的收縮Dict 的rehash ZipListZipListEntryencoding 編碼字符串整數 ZipList的連鎖更新問題 QuickListQuickList源碼 SkipListRedisOb…

微信小程序 - 頁面跳轉(wx.navigateTo、wx.redirectTo、wx.switchTab、wx.reLaunch)

API 跳轉 1、wx.navigateTo &#xff08;1&#xff09;基本介紹 功能&#xff1a;保留當前頁面&#xff0c;跳轉到應用內的某個頁面&#xff0c;使用該方法跳轉后可以通過返回按鈕返回到原頁面 使用場景&#xff1a;適用于需要保留當前頁面狀態&#xff0c;后續還需返回的情…

Qt 中集成mqtt協議

一&#xff0c;引入qmqtt 庫 我是將整個頭文件/源文件都添加到了工程中進行編譯&#xff0c;這樣 跨平臺時 方便&#xff0c;直接編譯就行了。 原始倉庫路徑&#xff1a;https://github.com/emqx/qmqtt/tree/master 二&#xff0c;使用 聲明一個單例類&#xff0c;將訂閱到…

分布式之Raft算法

參考&#xff1a; 分布式算法 - Raft算法 | Java 全棧知識體系 Raft 算法詳解 | JavaGuide 分布式 | CS-Notes 面試筆記

安裝PHPStudy 并搭建DVWA靶場

目錄 一、PHPStudy 簡介 二、DVWA 簡介 三、安裝 PHPStudy 四&#xff1a;安裝 DVWA 一、PHPStudy 簡介 phpstudy傻瓜式的一鍵啟動&#xff0c;支持WAMP、WNMP、LAMP、LNMP&#xff0c;一鍵切換環境&#xff08;nginxapahce&#xff09;,一鍵切換PHP版本&#xff08;5.1-7…

孜然單授權系統V2.0PHP授權系統

孜然單授權V1.0系統&#xff0c;延續了2022年開發的孜然多應用授權系統V2.0 變更&#xff1a;多應用變單系統&#xff0c;去除沒用的垃圾代碼&#xff0c;從0開發&#xff0c;去除了一些沒用的功能 完善了開發文檔&#xff0c;之前那套是我寫著玩的屎山代碼&#xff0c;V1.0將展…

紅帽7基于kickstart搭建PXE環境

Kickstart 文件是一種配置文件&#xff0c;用于定義 Linux 系統安裝過程中的各種參數&#xff0c;如分區、網絡配置、軟件包選擇等。system-config-kickstart 提供了一個圖形界面&#xff0c;方便用戶快速生成這些配置文件。 用戶可以通過圖形界面進行系統安裝的詳細配置&…

怎么合并主從分支,要注意什么

在 Git 中合并主從分支&#xff08;例如將 feature 分支合并到 main 分支&#xff09;是一個常見操作。以下是具體步驟和注意事項&#xff1a; 合并分支的步驟 切換到主分支 git checkout main確保當前在 main 分支。 拉取最新代碼 git pull origin main確保 main 分支是最…

Java數據結構第十二期:走進二叉樹的奇妙世界(一)

專欄&#xff1a;數據結構(Java版) 個人主頁&#xff1a;手握風云 目錄 一、樹型結構 1.1. 樹的定義 1.2. 樹的基本概念 1.3. 樹的表示形式 二、二叉樹 2.1. 概念 2.2. 兩種特殊的二叉樹 2.3. 二叉樹的性質 2.4. 二叉樹的存儲 三、二叉樹的基本操作 一、樹型結構 1.…

匹配算法:向下就近原則,向下沒有就向上

匹配算法&#xff1a;向下就近原則&#xff0c;向下沒有就向上 實現方式一實現方式二總結 實現方式一 private static List<Integer> findMatches(List<Integer> sourceList, List<Integer> searchValues) {List<Integer> sortedList sourceList.stre…

基于 Python Django 的校園互助平臺(附源碼,文檔)

博主介紹&#xff1a;?Java徐師兄、7年大廠程序員經歷。全網粉絲13w、csdn博客專家、掘金/華為云等平臺優質作者、專注于Java技術領域和畢業項目實戰? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&#x1f3fb; 精彩專欄推薦訂閱&#x1f447;&#x1f3fb; 不…

IP地址 vs 域名:分布式系統中的服務尋址之爭

在分布式系統中&#xff0c;服務之間的通信是核心問題之一。如何高效、穩定地找到目標服務&#xff0c;是每個開發者都需要面對的挑戰。常見的服務尋址方式有兩種&#xff1a;IP地址 和 域名。這兩種方式各有優劣&#xff0c;適用于不同的場景。本文將從性能、穩定性、動態性、…

【技術筆記】Cadence 創建元器件 Pin 引腳的創建與設置

【技術筆記】Cadence 創建元器件 Pin 引腳設置 一、管腳 Pin 放置方式1. 直接放置&#xff08;快捷鍵【Shift】【G】&#xff09;2. 按照Pin陣列放置引腳&#xff08;快捷鍵【Shift】【J】&#xff09;3. 通過Excel表格創建元器件 二、引腳屬性設置1. 創建Pin設置&#xff0c;E…

java面試場景問題

還在補充&#xff0c;這幾天工作忙&#xff0c;閑了會把答案附上去&#xff0c;也歡迎各位大佬評論區討論 1.不用分布式鎖如何防重復提交 方法 1&#xff1a;基于唯一請求 ID&#xff08;冪等 Token&#xff09; 思路&#xff1a;前端生成 一個唯一的 requestId&#xff08;…

Windows11安裝GPU版本Pytorch2.6教程

1: 準備工作 針對已經安裝好的Windows11系統&#xff0c;先檢查Nvidia驅動和使用的CUDA版本情況。先打開Windows PowerShell&#xff0c;通過nvidia-smi命令查看GPU的情況&#xff0c;結果如下圖1所示&#xff0c;從結果中可知使用的CUDA版本為12.8。 圖1&#xff1a;檢測安裝…

深入了解Text2SQL開源項目(Chat2DB、SQL Chat 、Wren AI 、Vanna)

深入了解Text2SQL開源項目&#xff08;Chat2DB、SQL Chat 、Wren AI 、Vanna&#xff09; 前言 1.Chat2DB2.SQL Chat3.Wren AI4.Vanna 前言 在數據驅動決策的時代&#xff0c;將自然語言查詢轉化為結構化查詢語言&#xff08;SQL&#xff09;的能力變得日益重要。無論是小型…