[ LeetCode優選算法專題一雙指針-----盛最多的水]

1.題目鏈接

LeetCode盛最多的水

2.題目描述

3.題目解析?

問題本質分析

"盛最多水的容器" 問題可以抽象為:在坐標軸上有 n 條垂直線段,第 i 條線段的兩個端點分別是 (i, 0) 和 (i, height [i])。找到兩條線段,使得它們與 x 軸共同構成的容器能夠容納最多的水。

容器的容量計算公式是:面積 = 寬度 × 高度,其中:

  • 寬度 = 兩條線段的橫坐標之差
  • 高度 = 兩條線段中較短那條的長度(因為水會從較短的一邊溢出)

算法核心思路

采用雙指針從兩端向中間移動,通過貪心策略每次選擇可能獲得更大面積的移動方向:

  1. 初始狀態:左指針在最左端 (left=0),右指針在最右端 (right=height.size ()-1)
  2. 計算當前面積:以當前雙指針為邊界計算容器面積
  3. 更新最大面積:如果當前面積大于歷史最大值,則更新
  4. 移動指針
    • 若左指針指向的線段更短,移動左指針 (left++)
    • 否則,移動右指針 (right--)
  5. 終止條件:左右指針相遇 (left>= right)

?下面我們畫圖理解:

1.定義兩個指針分別從左右兩端開始,計算當前的V

2.接著開始移動指針?

如果移動right,L會減小,H也會減小,則V一定減小,所以沒必要這么做.?

?

如果移動left,L會增大,H會減小,但V有可能增大?

為什么這樣移動指針是正確的?

這是理解算法的關鍵。假設我們有兩個指針 left 和 right,且 height [left] < height [right]:

  • 如果我們移動右指針,新的寬度一定減小(因為 right-left 變小)
  • 新的高度取決于新的 right' 和原 left 中的較小值,由于原 left 是較短的,新高度不會超過原高度
  • 因此,移動右指針只會得到更小的面積,不可能得到更大的面積

反之,如果 height [right] 更短,移動左指針也會導致面積減小。因此,只有移動較短的指針才有可能獲得更大的面積,這是一種貪心策略的體現。

這種雙指針解法的優勢在于:

  • 時間效率高:只需遍歷一次數組,O (n) 時間復雜度
  • 空間效率高:只使用常數級額外空間,O (1) 空間復雜度
  • 思路簡潔:通過貪心策略每次做出局部最優選擇,最終得到全局最優解

這個算法充分體現了貪心算法的思想 —— 通過每一步的局部最優選擇,最終達到全局最優。

完整代碼:?

?

代碼注釋:?

復雜度分析?

該雙指針解法在時間和空間上都達到了最優:

  • 時間復雜度:O (n)(線性時間,遍歷一次數組)
  • 空間復雜度:O (1)(常數空間,不依賴輸入規模)

這也是該算法被認為是「盛最多水的容器」問題最優解的核心原因 —— 在保證正確性的前提下,實現了極高的效率。

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

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

相關文章

舊筆記本電腦如何安裝飛牛OS

01引言隨著電子產品的更新換代&#xff0c;我們有很多的電子產品已經滿足不了現在的工作需求和日常娛樂了&#xff0c;比如&#xff1a;用了很久厚重筆記本電腦放在現在辦公也是有點吃力了&#xff0c;我們現在換新了舊的還不想放在那里吃灰&#xff0c;怎么辦呢&#xff1f;我…

某金服Java面試終極指南:25題完整解析與場景化方案

涵蓋分布式鎖、緩存、事務、高并發等金融系統核心考點&#xff0c;附解決方案與抗風險設計一、分布式鎖深度解決方案 1. Redis分布式鎖完整實現 // 原子加鎖 防死鎖 String uuid UUID.randomUUID().toString(); Boolean locked redisTemplate.opsForValue().setIfAbsent(&qu…

MATLAB 2025a的下載以及安裝,安裝X310的測試附加功能(附加安裝包)

首先將安裝包下載到本地中之后解壓該文件夾&#xff0c;打開文件發現有兩個文件&#xff0c;其中crach文件夾中是破解matlab所用到的文件。而另一個壓縮包就是需要安裝的文件&#xff0c;要先解壓在安裝。在安裝之前將網絡斷開&#xff0c;不然可能破解不成功&#xff0c;先進入…

Scala實用編程(附電子書資料)

概述 Scala 是一種多范式編程語言&#xff0c;結合了面向對象編程&#xff08;OOP&#xff09;和函數式編程&#xff08;FP&#xff09;的特性電子書資料&#xff1a;https://pan.quark.cn/s/88737d4a680d Scala 的核心特點多范式融合 既支持面向對象編程&#xff08;類、繼承、…

數據結構(8)雙向鏈表

目錄 一、概念與結構 二、雙向鏈表的實現 1、初始化 2、尾插 3、頭插 4、尾刪 5、頭刪 6、在指定位置之后插入結點 7、刪除指定位置的結點 三、完整參考代碼 一、概念與結構 這里的雙向鏈表是指帶頭的的雙向循環鏈表&#xff0c;這里的“帶頭”和之前所說的“頭結…

【DeepSeek-R1 】分詞系統架構解析

文章目錄 ??前言 ?? 1. SentencePiece Unigram 的核心原理 1.1 算法基礎框架 1.2 核心數學原理 1.3 與BPE/WordPiece的對比 ?? 2. DeepSeek-R1 分詞器實現細節 2.1 詞表結構設計 2.2 關鍵特性實現 ?? 3. 性能優化關鍵技術 3.1 加速策略對比 3.2 編碼過程偽代碼 ?? 4.…

Linux自主實現shell

以下是在Linux操作系統 centos7版本下實現的shell &#xff0c;該shell具備bash的基礎功能&#xff0c;無上下鍵輸入歷史命令功能&#xff0c;刪除字符或命令時按住Ctrl Back #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.…

vue+elementUI上傳圖片至七牛云組件封裝及循環使用

1.效果&#xff08;解決循環組件賦值問題&#xff09; 廢話不多說直接上代碼 2.下載七牛云依賴 npm install qiniu-js # 或者使用 yarn yarn add qiniu-js3.在vue組件中引入 import * as qiniu from qiniu-js4.在components文件夾下創建UploadImg1/uploadImg.vue組件 <templ…

2025年6月電子學會青少年軟件編程(C語言)等級考試試卷(一級)

答案和更多內容請查看網站&#xff1a;【試卷中心 -----> 電子學會 ----> C/C ----> 一級】 網站鏈接 青少年軟件編程歷年真題模擬題實時更新 一、編程題 第 1 題 希望如光 題目描述 在充滿挑戰的生活中&#xff0c;希望往往是支撐人們穿越黑暗的核心力量。這…

拒絕復雜,AI圖表制作簡單化

在信息爆炸的時代&#xff0c;數據可視化已成為傳遞信息的核心手段。無論是職場匯報中的業績分析&#xff0c;還是學術研究里的實驗數據呈現&#xff0c;一張清晰直觀的圖表往往能勝過千言萬語。而 AI 技術的介入&#xff0c;徹底改變了圖表制作的傳統模式 —— 它不僅讓零基礎…

easypoi生成多個sheet的動態表頭的實現

在使用 EasyPOI 導出 Excel 時&#xff0c;生成多個 Sheet 且每個 Sheet 的表頭是動態的&#xff08;即每個 Sheet 的列數和列名可能不同&#xff09;&#xff0c;可以通過如下方式實現&#xff1a;? 實現原理簡述 使用 Workbook workbook ExcelExportUtil.exportExcel(expor…

移除鏈表元素+反轉鏈表+鏈表的中間節點+合并兩個有序鏈表+環形鏈表約瑟夫問題+分割鏈表

一、移除鏈表元素 給你一個鏈表的頭節點 phead 和一個整數 val &#xff0c;請你刪除鏈表中所有滿足 Node.val val 的節點&#xff0c;并返回 新的頭節點 (列表中的節點數目在范圍 [0, 104] 內) 示例&#xff1a;輸入&#xff1a;head [1,2,6,3,4,5,6], val 6 …

vue3+arcgisAPI4示例:軌跡點模擬移動(附源碼下載)

demo源碼運行環境以及配置運行環境&#xff1a;依賴Node安裝環境&#xff0c;需要安裝Node。 運行工具&#xff1a;vscode或者其他工具。 配置方式&#xff1a;下載demo源碼&#xff0c;vscode打開&#xff0c;然后順序執行以下命令&#xff1a; &#xff08;1&#xff09;下載…

Design Compiler:Milkyway庫的創建與使用

相關閱讀 Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482 DC Ultra推出了拓撲模式&#xff0c;在綜合時會對標準單元進行粗布局(Coarse Placement)并使用虛擬布線(Virtual Routing)技術計算互聯延遲&#xff0c;關于拓…

嵌入式教學的云端革命:高精度仿真如何重塑倒車雷達實驗與工程教育——深圳航天科技創新研究院賦能新一代虛實融合實訓平臺

一、嵌入式教學的困境與破局之道 在傳統嵌入式系統教學中&#xff0c;硬件依賴始終是核心痛點。以“倒車雷達實驗”為例&#xff0c;學生需操作STM32開發板、超聲波傳感器、蜂鳴器等硬件&#xff0c;面臨設備損耗、接線錯誤、調試效率低等問題。更關鍵的是&#xff0c;物理硬件…

flutter-boilerplate-project 學習筆記

項目地址&#xff1a; https://github.com/zubairehman/flutter_boilerplate_project/tree/master 樣板包含創建新庫或項目所需的最小實現。存儲庫代碼預加載了一些基本組件&#xff0c;例如基本應用程序架構、應用程序主題、常量和創建新項目所需的依賴項。通過使用樣板代碼…

集成電路學習:什么是CMSIS微控制器軟件接口標準

CMSIS,即Cortex Microcontroller Software Interface Standard(Cortex微控制器軟件接口標準),是由ARM公司與多家不同的芯片和軟件供應商緊密合作定義的一個標準。該標準旨在為基于ARM Cortex處理器的微控制器提供一套與供應商無關的硬件抽象層,從而簡化軟件的開發、重用,…

由淺入深使用LangGraph創建一個Agent工作流

創建一個簡單的工作流&#xff1a;Start ——> 節點1(固定輸入輸出) ——> Endfrom langchain_core.messages import SystemMessage, HumanMessage, AIMessage from langgraph.graph import StateGraph, START, END from typing_extensions import TypedDict from typing…

PL-0功能拓展及基于VSCode的IDE配置

title: PL/0功能拓展及基于VSCode的IDE配置 date: 2024-08-06 22:46:38 tags: 做過的實驗||項目復盤 top: true 概述PL/0語言可以看成PASCAL語言的子集,它的編譯程序是由C語言編寫的編譯解釋執行系統。PL/0能充分展示高級語言的最基本成分。拓展了pl0語言的基礎功能&#xff08…

【低空經濟】大型露天礦區安全生產無人機巡查與管理系統設計

1. 引言 大型露天礦區因其廣闊的作業區域和復雜的環境條件&#xff0c;安全生產管理面臨著嚴峻的挑戰。隨著科技的進步&#xff0c;無人機作為一種現代化的巡查工具&#xff0c;逐漸被應用于礦區的安全生產管理中。無人機具備高效、靈活、成本相對低廉等優點&#xff0c;可以在…