盛水最多的容器問題詳解:雙指針法與暴力法的對比與實現

文章目錄

    • 問題描述
    • 方法探討
      • 方法一:暴力法(Brute Force)
        • 思路
        • 代碼實現
        • 復雜度分析
      • 方法二:雙指針法(Two Pointers)
        • 思路
        • 正確性證明
        • 代碼實現
        • 復雜度分析
    • 方法對比
    • 總結

摘要
盛水最多的容器(Container With Most Water)是LeetCode上一道經典的算法題,考察對數組和雙指針技巧的應用。本文將詳細分析問題的核心思路,探討暴力法和雙指針法兩種實現方法,并對比它們的性能差異。通過代碼實現和復雜度分析,幫助深入理解如何高效解決此類問題。


問題描述

11. 盛最多水的容器
在這里插入圖片描述

方法探討

方法一:暴力法(Brute Force)

思路

暴力法是最直接的思路:遍歷所有可能的線對組合,計算每對線構成的容器容量,記錄最大值。

代碼實現
public class Solution {public int maxAreaBruteForce(int[] height) {int maxArea = 0;for (int i = 0; i < height.length; i++) {for (int j = i + 1; j < height.length; j++) {int currentHeight = Math.min(height[i], height[j]);int currentWidth = j - i;maxArea = Math.max(maxArea, currentHeight * currentWidth);}}return maxArea;}
}
復雜度分析
  • 時間復雜度:O(n2),需要兩重循環遍歷所有可能的線對。
  • 空間復雜度:O(1),僅使用常數級額外空間。

缺點
當數組長度較大時(如 n=10^5),暴力法會超時,無法處理大規模數據。


方法二:雙指針法(Two Pointers)

思路

雙指針法通過一次遍歷高效解決問題,核心思想是縮減搜索空間

  1. 初始化指針:左指針 left 指向數組起始位置,右指針 right 指向數組末尾。
  2. 計算容量:當前容量由 min(height[left], height[right]) * (right - left) 決定。
  3. 移動指針:每次移動高度較小的指針(因為移動較高的指針不會增加容量)。
  4. 更新最大值:比較并記錄最大容量。
正確性證明

假設當前左右指針高度分別為 h[left]h[right],且 h[left] < h[right]。此時若固定 left,無論 right 如何左移,新的容量一定小于當前容量(因為寬度減小,高度不超過 h[left])。因此,必須移動左指針才有可能找到更大的容量。

代碼實現
public class Solution {public int maxArea(int[] height) {int left = 0, right = height.length - 1;int maxArea = 0;while (left < right) {int currentHeight = Math.min(height[left], height[right]);int currentWidth = right - left;maxArea = Math.max(maxArea, currentHeight * currentWidth);// 移動較低的一側指針if (height[left] < height[right]) {left++;} else {right--;}}return maxArea;}
}
復雜度分析
  • 時間復雜度:O(n),只需一次遍歷。
  • 空間復雜度:O(1)。

方法對比

方法時間復雜度空間復雜度適用場景
暴力法O(n2)O(1)小規模數據
雙指針法O(n)O(1)大規模數據

總結

  1. 暴力法雖然簡單直觀,但效率低下,僅適用于學習階段的小規模數據驗證。
  2. 雙指針法通過縮小搜索空間將復雜度降至線性級別,是解決此問題的標準方法。
  3. 關鍵思路:移動較低一側的指針,確保不會錯過更大容量的可能性。

拓展思考
雙指針法還可以用于解決其他類似問題,如“接雨水”(Trapping Rain Water) 從暴力到動態規劃再到雙指針:使用 Java 探索接雨水問題的不同解法。理解其核心思想有助于舉一反三,應對更多復雜場景。

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

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

相關文章

圖論-BFS搜索圖/樹-最短路徑問題的解決

續上篇~圖論--DFS搜索圖/樹-CSDN博客 先看第一次學習的博客&#xff01;&#xff01;&#x1f447;&#x1f447;&#x1f447;&#x1f447; &#x1f449; 有一些問題是廣搜 和 深搜都可以解決的&#xff0c;例如島嶼問題&#xff0c;這里我們記dfs的寫法就好啦&#xff0c;…

C++進階——C++11_智能指針

目錄 1、問題引入 2、RAII和智能指針 3、C標準庫的智能指針 3.1 auto_ptr (不好) 3.2 unique_ptr 3.3 shared_ptr (重點) 3.4 weak_ptr (重點) 4、shared_ptr的循環引用問題(重點) 5、shared_ptr的線程安全問題 6、C11智能指針和boost的關系 7、內存泄漏 7.1 什么是…

數據庫的基本原則

數據庫的核心原則 原子性與持久性&#xff1a;原子性&#xff08;Atomicity&#xff09;確保一個事務中的所有操作要么全部完成&#xff0c;要么完全不執行&#xff0c;不會出現部分完成的情況。持久性&#xff08;Durability&#xff09;則保證一旦事務提交成功&#xff0c;即…

Java設計模式實戰:裝飾模式在星巴克咖啡系統中的應用

一、裝飾模式簡介 裝飾模式&#xff08;Decorator Pattern&#xff09;是一種結構型設計模式&#xff0c;它允許向一個現有的對象添加新的功能&#xff0c;同時又不改變其結構。這種模式創建了一個裝飾類&#xff0c;用來包裝原有的類&#xff0c;并在保持類方法簽名完整性的前…

使用MPI-IO并行讀寫HDF5文件

使用MPI-IO并行讀寫HDF5文件 HDF5支持通過MPI-IO進行并行讀寫&#xff0c;這對于大規模科學計算應用非常重要。下面我將提供C和Fortran的示例程序&#xff0c;展示如何使用MPI-IO并行讀寫HDF5文件。 準備工作 在使用MPI-IO的HDF5之前&#xff0c;需要確保: HDF5庫編譯時啟用…

七、自動化概念篇

自動化測試概念 自動化測試是把以人為驅動的測試行為轉化為機器執行的一種過程。通常&#xff0c;在設計了測試用例并通過評審之后&#xff0c;由測試人員根據測試用例中描述的過程一步步執行測試&#xff0c;得到實際結果與期望結果的比較。在此過程中&#xff0c;為了節省人…

redis cluster 的通信機制

Redis Cluster 的通信機制是其分布式架構的核心&#xff0c;基于 Gossip 協議 和 Cluster Bus 實現節點間狀態同步與數據協調。以下是其通信機制的核心要點&#xff1a; 二進制協議&#xff1a;數據以字節流形式編碼&#xff08;如Protobuf、Thrift、MQTT、Gossip&#xff09;。…

CTF web入門之文件上傳

知識點 產生文件上傳漏洞的原因 原因: 對于上傳文件的后綴名(擴展名)沒有做較為嚴格的限制 對于上傳文件的MIMETYPE(用于描述文件的類型的一種表述方法) 沒有做檢查 權限上沒有對于上傳的文件目錄設置不可執行權限,(尤其是對于shebang類型的文件) 對于web server對于上傳…

PhotoShop學習09

1.彎曲鋼筆工具 PhotoShop提供了彎曲鋼筆工具可以直觀地創建路徑&#xff0c;只需要對分段推拉就能夠進行修改。彎曲港幣工具位于工具面板中的鋼筆工具里&#xff0c;它的快捷鍵為P。 在使用前&#xff0c;可以把填充和描邊選為空顏色&#xff0c;并打開路徑選項&#xff0c;勾…

tsconfig.json配置不生效

說明一下我遇到的問題&#xff0c;這是我的配置文件代碼的 {"compilerOptions": {"module": "none","target": "ES5","outFile": "./dist/bundle.js"} } 和我想象不同的是&#xff0c;我編譯成 js 沒…

源代碼加密之零日攻擊

# SDC沙盒&#xff1a;有效防御零日攻擊的多層防護體系 在當今復雜多變的網絡安全環境中&#xff0c;零日攻擊已成為企業面臨的重大威脅之一。零日攻擊利用尚未被公眾發現或尚未被軟件供應商修復的漏洞進行攻擊&#xff0c;具有極高的隱蔽性和破壞性。SDC沙盒作為一種先進的數…

記錄一次TDSQL網關夯住故障

環境信息&#xff1a; TDSQL-MySQL同城雙中心集群&#xff0c;集中式實例&#xff0c;一主三副本&#xff0c;每個中心兩個db副本&#xff0c;每個中心一個VIP&#xff0c;V每個IP通過硬件做負載均衡指向該中心兩個proxy&#xff0c;操作系統為麒麟v10 arm。 故障描述&#xf…

代碼隨想錄八股訓練營完結總結

&#xff01; 40天的訓練營&#xff0c;我總結了自己完整的八股文&#xff0c;后續在面試過程中可以補充 很感謝這次訓練營&#xff0c;真的高頻&#xff0c;在面試中能擊中60%以上&#xff0c;剩下的就靠平時的積累了。 感謝訓練營的小伙伴&#xff0c;很多次想偷懶&#x…

VS Code 的 .S 匯編文件里面的注釋不顯示綠色

1. 確認文件語言模式 打開 .S 文件后&#xff0c;查看 VS Code 右下角的狀態欄&#xff0c;確認當前文件的識別模式&#xff08;如 Assembly、Plain Text 等&#xff09;。如果顯示為 Plain Text 或其他非匯編模式&#xff1a; 點擊狀態欄中的語言模式&#xff08;如 Plain Te…

iphone各個機型尺寸

以下是蘋果&#xff08;Apple&#xff09;歷代 iPhone 機型 的屏幕尺寸、分辨率及其他關鍵參數匯總&#xff08;截至 2023年10月&#xff0c;數據基于官方發布信息&#xff09;&#xff1a; 一、標準屏 iPhone&#xff08;非Pro系列&#xff09; 機型屏幕尺寸&#xff08;英寸…

VSCode寫java時常用的快捷鍵

首先得先安好java插件 1、獲取返回值 這里是和idea一樣的快捷鍵的&#xff0c;都是xxxx.var 比如現在我new一個對象 就輸入 new MbDo().var // 點擊回車即可變成下面的// MbDo mbDo new MbDo()//以此類推get方法也可獲取 mbDo.getMc().var // 點擊回車即可變成下面的 // St…

相機內外參

文章目錄 相機內參相機外參 相機的內外參是相機標定過程中確定的重要參數&#xff0c;用于建立圖像像素坐標與實際世界坐標之間的關系。 相機內參 定義&#xff1a;相機內參是描述相機內部光學和幾何特性的參數&#xff0c;主要包括焦距、主點坐標、像素尺度因子以及畸變系數等…

【視頻目標分割論文集】Efficient Track Anything0000

github 摘要 視頻對象分割和追蹤任意目標領域出現了強大的工具——分割任意模型 2&#xff08;SAM 2&#xff09;。SAM 2 實現令人印象深刻的視頻對象分割性能的關鍵組成部分包括用于幀特征提取的大型多階段圖像編碼器&#xff0c;以及存儲過去幀記憶上下文以輔助當前幀分割的…

CSS學習02 動態列數表格開發,解決多組數據布局與邊框重合問題

概要 在前端開發中&#xff0c;表格常用于展示結構化數據。當數據組的字段數量不統一時&#xff08;如有的行包含 3 組數據&#xff0c;有的行包含 2 組或 1 組&#xff09;&#xff0c;傳統固定列數的表格會出現結構錯位、邊框重合等問題。本文通過 HTML/CSS 規范方法&#x…

Spark-core編程總結

1.reduce? 功能?&#xff1a;聚集RDD中的所有元素&#xff0c;先聚合分區內數據&#xff0c;再聚合分區間數據。 示例?&#xff1a;rdd.reduce(__) 將RDD中的所有整數相加。 2.collect? 功能?&#xff1a;在驅動程序中&#xff0c;以數組Array的形式返回數據集的所有元…