雙指針:從「LC11 盛最多水的容器」到「LC42 接雨水」

LC11 盛最多水的容器
選擇兩條線,它們與x軸構成的容器可以盛的水量取決于兩條線中較短的那條以及兩條線之間的距離。

樸素的思想是使用ij遍歷height中的所有線,但是這樣的時間復雜度是O(n2)O(n^2)O(n2)

我們讓i0開始,jn-1開始,組成一個容器。
在這里插入圖片描述
不妨假設height[0]<=height[n-1],則固定左端點組成的所有容器中,無論右端點在哪,容器的盛水高度不可能高過左端點的線高,故初始容器就是固定左端點組成的所有容器中盛水量最多的容器。這里本質上把固定左端點對右端點進行O(n)O(n)O(n)的掃描通過分析變成了O(1)O(1)O(1)

i=0的情況看完了,接下來應該移動左端點i。這里本質上是在固定右端點對左端點進行掃描。我們將左端點移動到比初始線高更高的第一個位置,則組成容器的盛水高度會變高,才有可能盛水量更多。則容器左端點從初始的i=0到現在位置中的所有左端點,其右端點一直保持j=n-1,因為不需要掃描,對于這些左端點,移動右端點不會使得盛水量更多。這里的分析就是算法的時間復雜度下降的原因。我們只需要分析如何讓容器向著盛水量可能變大的方向去變化,每次移動較矮側的端點至下一個更高位置處即可。

最終容器的變化過程就是,每次讓容器較矮的一側變的更高,直到兩個端點重合。這樣時間復雜度就是左右端點共同掃描完原數組,即O(n)O(n)O(n)

這里我們對完備性進行一些簡單證明。我們算法移動左右端點的過程中不會固定某一個端點對另一個端點進行O(n)O(n)O(n)的掃描都是因為通過分析可知,當我們在移動一側的過程中,沒有移動的那一側無論取在哪也不會使得盛水量變大,所以盛水量最多的情形只要其左端點或者右端點作為過我們算法移動過程中的對應左端點或右端點,則我們的算法一定會得到不小于盛水量最多情形的結果。而由于那又是盛水量最多的情形,所以不小于即為等于。

class Solution {public int maxArea(int[] height) {int left=0,right=height.length-1,ans=0;while(left<right){ans=Math.max(ans,Math.min(height[left],height[right])*(right-left));if(height[left]<=height[right]){int std=height[left];//讓left向右移動到一個更高的位置for(;left<right;left++){if(height[left]>std) break;}}else{int std=height[right];//讓right向左移動到一個更高的位置for(;right>left;right--){if(height[right]>std) break;}}}return ans;}
}

這里的ij就是雙指針,從兩側向中間收攏,每次變化都向著可能使得盛水量變大的方向變化,且每次變化的特點是容器的盛水高度更高,寬度更小。這一題的變化過程分析對LC42 接雨水的解題有幫助。

LC42 接雨水
這道題也可以一樣使用從兩側向中間收攏的雙指針。我們下圖中的線實際是一個寬度為1的柱子,這里畫圖簡化了。
在這里插入圖片描述
我們記minH為當前兩個端點柱子高度的較小值,一開始讓i=0j=n-1lastH為地面高度為0。則初始狀態可以計算出lastHminH高度之間的雨水量。

不妨假設height[0]<=height[n-1],則無論怎么移動右端點,i=0高于minH的部分都不會有雨水,這點和LC11中的容器很像。所以對于i=0的部分,不需要花費O(n)O(n)O(n)去遍歷右端點j,這時應該直接移動左端點i至下一個更高的柱子處,找到積水高度更高的“容器”。找到后,更新minH的值,并將原本minH的值給lastH,計算雨水量的增量是新的minH和最初minH即當前lastH之間的雨水,且容易反證在當前左端點左側高于初始minH的部分不可能有雨水,這點和LC11中的容器也很像,因為該部分不屬于新容器的范圍。

這樣我們一樣是以O(n)O(n)O(n)的時間復雜度遍歷了所有可能有雨水的左右端點情形,以樸素的思想,會在每個我們更新更高柱子的“容器”中遍歷中間的每個寬度計算當前ij寬度之間、當前lastHminH高度之間的雨水量,這樣總時間復雜度是O(n2)O(n^2)O(n2),不是最優。

接下來需要再利用一定的分析技巧去降低時間復雜度,我們不要在每次“容器”改變形狀時去遍歷寬度計算雨水。我們有如下發現,以我們的左端點來看,我們會讓左端點i0變化到下一個更高柱子處,然后繼續到下一個更高的柱子處,所有的雨水不會出現在每一個更高的柱子處,只會出現在我們移動左端點前后的中間的柱子處,且雨水高度也均為移動前的minH。所以我們有更聰明的計算雨水的方法,每次移動端點時,計算該端點處的雨水量(minH-height[i],以左端點為例),而不再每次去遍歷寬度計算“容器”內的lastHminH高度之間的雨水量。這樣總時間復雜度就被優化至O(n)O(n)O(n)

class Solution {public int trap(int[] height) {int n=height.length,i=0,j=n-1;int minH,ans=0;while(i<j){minH=Math.min(height[i],height[j]);//i和j處較矮者向中間移動,移動至更高處停止//每次移動,計算移動的那個寬度的雨水量if(height[i]<=height[j]){for(;i<j&&height[i]<=minH;i++){ans+=minH-height[i];}}else{for(;i<j&&height[j]<=minH;j--){ans+=minH-height[j];}}}return ans;}
}

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

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

相關文章

WINTRUST!_GetMessage函數分析之CRYPT32!CryptSIPGetSignedDataMsg函數的作用是得到nt5inf.cat的信息

UEDIT打開nt5inf.cat。第一部分&#xff1a;BOOL _GetMessage(CRYPT_PROVIDER_DATA *pProvData) {DWORD dwMsgEncoding;SIP_SUBJECTINFO *pSubjInfo;SIP_DISPATCH_INFO *pSip;DWORD cbEncodedMsg;BYTE *pbEncodedMsg;DWORD …

編譯esp32報錯解決辦法

報錯信息&#xff1a;CMake Error at build/CMakeFiles/git-data/grabRef.cmake:48 (file):file failed to open for reading (No such file or directory):這個錯誤是由于 Git 的安全檢查導致的。從錯誤信息可以看出&#xff0c;Git 檢測到了"可疑的所有權"&#xf…

【AI】常見8大LLM大語言模型地址

序號AI名稱地址1 ChatGPT &#xff08;OpenAI&#xff09;https://chat.openai.com/2Gemini (Google personal AI assistant)https://gemini.google.com/app3Grok (xAI Grok LLM)https://x.ai/4DeepSeek (DeepSeek AI chatbot)DeepSeek5Claude (Anthropic Claude AI)App unavai…

軟件系統的部署方式:單機、主備(冷主備、熱主備)、集群

一、單機部署單機部署是將軟件系統所有組件&#xff08;應用、數據庫等&#xff09;部署在單臺服務器上&#xff0c;架構簡單、成本低但存在單點故障風險&#xff0c;適用于低負載或測試場景。一臺服務器壞了&#xff0c;軟件系統無法服務。二、主備&#xff08;冷主備、熱主備…

從體驗到系統工程丨上手評測國內首款 AI 電商 App

作者&#xff1a;王晨&#xff08;望宸&#xff09; 產品界面&#xff0c;往往體現了產品的設計哲學&#xff0c;界面是產品的第一入口。 近期&#xff0c;1688 推出了 1688 AI App&#xff0c;這貌似是國內第一個電商領域的獨立 AI App 應用&#xff08;若不是&#xff0c;歡…

QML QQuickImage: Cannot open: qrc:/images/shrink.png(已解決)

此問題是 在 QT Quick 項目 顯示圖片的時候 遇到&#xff0c;顯示&#xff1a;QML QQuickImage: Cannot open: qrc:/images/shrink.png&#xff0c;不能 打開 圖片。為了解決此問題&#xff0c;找了很多資料&#xff0c;雖然是比較簡單&#xff0c;但對于初學者來說&#xff0c…

maven scope 詳解

Maven 的 scope用于定義依賴項在項目構建生命周期中的可見性和傳遞性&#xff0c;控制依賴在編譯、測試、運行等階段的可用性及是否被打包到最終產物中。以下是詳細解析&#xff1a;?? ??一、Scope 的核心作用????生命周期控制??決定依賴在編譯、測試、運行階段的可用…

Python的一次實際應用:利用Python操作Word文檔的頁碼

Python的一次實際應用&#xff1a;利用Python操作Word文檔的頁碼 需求&#xff1a;一次性處理24個文檔的頁碼。 文檔詳情&#xff1a; 1、每個word文檔包含800頁左右&#xff0c;每一頁包含一個標題和一張圖片。 2、由于圖片有橫排也有豎排&#xff0c;因此&#xff0c;每頁文檔…

Android15 GKI版本分析Kernel Crash問題

環境介紹編譯主機&#xff1a;amd64 Ubuntu 22.04Android源碼&#xff1a;Android15 GKIKernel版本&#xff1a;Linux 6.16Android構建系統&#xff1a;bazel構建工具鏈&#xff1a;gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-定位Linux…

rocky 9部署Zabbix監控

一、rocky安裝 需要注意在設置root用戶密碼時&#xff0c;勾選ssh遠程連接 安裝完成后直接用root登錄 1. 網絡配置 輸入nmtui 進入網絡配置界面 選擇 Edit a connection&#xff0c;再選擇接口 ens3 IPV4更改為Maual 手動模式 根據實際環境配置IP地址 重啟網絡 systemctl …

從9.4%到13.5%:ICDM2025錄取率觸底反彈,競爭壓力稍緩

近日&#xff0c;ICDM 2025公布了論文錄用結果。本次大會共收到785篇有效論文投稿&#xff0c;最終&#xff0c;共有106篇常規論文和70篇短論文被接收&#xff0c;總體接收率為22.4%&#xff0c;其中全文論文的接收率為13.5%。與前年9.4%、去年11.09%的錄取率相比&#xff0c;I…

linux上安裝methylkit -- 安全下車版 (正經版: Linux環境下安裝methylKit的實踐與避坑指南)

題外話&#xff1a; 我踩過的坑&#xff0c;都將成為我寫貼的素材&#xff01;(ㄒoㄒ) 整整安裝了兩天&#xff0c;這里面的滋味懂的都懂。 希望開發作者持續維護。 希望有人或者作者持續打包成sigularity鏡像使用&#xff0c;并且直接傳到github上&#xff0c;傳到docker上下…

【leetcode】114. 二叉樹展開為鏈表

文章目錄題目題解1. 遞歸2. 迭代3. 右指針重排&#xff0c;始終將右子樹添加到左子樹的最右題目 114. 二叉樹展開為鏈表 題解 1. 遞歸 先序遍歷然后將數組操作 for i in range(1, len(res)):prev, curr res[i - 1], res[i]prev.left Noneprev.right curr# Definition fo…

Vibe Coding、AI IDE/插件

概述 Vibe Coding&#xff0c;氛圍編程&#xff0c;AI輔助編程&#xff0c;三劍客&#xff1a; Google Gemini&#xff1a;OpenAI GPT&#xff1a;Anthropic Claude&#xff1a; IDE Cursor 基于VS Code開發。 特性&#xff1a; AI驅動的代碼生成&#xff1a;輸入想要的…

Unity高級UI拖動控制器教程

在游戲開發過程中&#xff0c;UI組件的拖動功能是一個常見的需求。特別是在需要實現拖動、邊界檢測、透明度控制以及動畫反饋等功能時&#xff0c;編寫一個高級UI拖動控制器將非常有用。在本文中&#xff0c;我們將創建一個支持多種Canvas模式和更精確邊界檢測的高級UI拖動控制…

零基礎上手:Cursor + MCP 爬取 YouTube 視頻數據

前言 大模型與 AI 應用越來越普及的今天&#xff0c;實時、穩定地獲取網絡數據變得尤為重要。無論是做內容分析、趨勢研究還是自動化任務&#xff0c;爬取和處理數據始終是繞不開的一環。 傳統爬蟲往往面臨封禁、驗證碼、動態渲染等難題&#xff0c;而 Bright Data MCP&#x…

frp 一個高性能的反向代理服務

文章目錄項目概述核心特性系統架構快速開始1. 下載安裝2. 服務端快速配置3. 客戶端快速配置4. 驗證連接配置文件說明代理類型TCP/UDP 代理HTTP/HTTPS 代理安全代理 (STCP/SUDP)P2P 代理 (XTCP)插件系統靜態文件服務HTTP/SOCKS5 代理協議轉換使用場景遠程辦公Web 服務發布游戲服…

Android -第二十一次技術總結

一、activity與Fragment的通信有哪些&#xff1f;使用接口進行通信的邏輯與代碼示例使用接口通信的核心是解耦&#xff0c;通過定義一個接口作為通信契約&#xff0c;讓 Fragment 不依賴于具體的 Activity 類型。1. 定義通信接口&#xff08;在 Fragment 內&#xff09;首先&am…

【算法】78.子集--通俗講解

通俗易懂講解“子集”算法題目 一、題目是啥?一句話說清 給你一個不含重復元素的整數數組,返回所有可能的子集(包括空集和它本身)。 示例: 輸入:nums = [1,2,3] 輸出:[[], [1], [2], [1,2], [3], [1,3], [2,3], [1,2,3]] 二、解題核心 使用回溯法(遞歸)或位運算來…

Cherrystudio的搭建和使用

1、下載和安裝 Cherry Studio 官方網站 - 全能的 AI 助手 2、配置LLM 3、聊天助手 3.1 添加和編輯助手 3.2 選擇LLM 3.3 對話聊天 4、配置MCP 4.1 安裝MCP執行插件 4.2 安裝 node和npm Node.js — Download Node.js npm -v 10.9.3 node -v v22…