[LeetCode解題攻略] 11. Container With Most Water

更新於 2024/12/06閱讀時間約 4 分鐘

這篇文章將介紹 LeetCode 題目 11. Container With Most Water。這是一道經典的雙指針問題,題目要求我們找到容器可以盛最多水的情況,並幫助我們理解如何通過移動左右指針來最大化結果。


題目概述

給定一個整數數組 height,每個數字代表不同位置的垂直線高度。選擇兩條線與 x 軸組成一個容器,計算該容器能裝最多的水量。

範例:

raw-image
Input: height = [1,8,6,2,5,4,8,3,7]
Output: 49

思路分析

這道題目要求我們找到能夠盛最多水的兩條垂直線,根據盛水的物理公式:

水量=min⁡(左邊界高度,右邊界高度)×(右邊界索引−左邊界索引)

要想得到最大水量,我們的目標是找到合適的左右邊界,使得「最小高度」與「距離」的乘積最大。

雙指針法

這道題的最佳解法是 雙指針法。我們從數組的兩端出發,逐步向內收縮指針,並在每一步計算出水量的大小。這樣可以在遍歷一次數組的情況下求得最大水量。

因為水量是由左右兩邊的最小高度決定的。假如我們移動高度較小的指針,或許能找到更高的邊界並形成更大面積;而如果移動高度較大的指針,則無法增大水量,因為水量取決於最小高度。因此,我們每次選擇移動高度較小的指針,來嘗試增加水量。

步驟

  1. 初始化左右指針,分別指向數組的兩端。
  2. 計算當前左右邊界能容納的水量,更新最大水量。
  3. 移動較小的指針,嘗試找到更高的邊界。
  4. 重複上述步驟,直到左右指針相遇。

實作 (Python)

class Solution:
def maxArea(self, height: List[int]) -> int:
left, right = 0, len(height) - 1
max_area = 0

while left < right:
# 計算當前水量
width = right - left
area = min(height[left], height[right]) * width
max_area = max(max_area, area)

# 移動較小的指針
if height[left] < height[right]:
left += 1
else:
right -= 1

return max_area

複雜度分析

  • 時間複雜度:O(n),因為我們只需要遍歷一次數組。
  • 空間複雜度:O(1),僅用了幾個指針和變數來存儲中間結果。

總結

這道題目通過雙指針法來優化查找過程,使得能夠在線性時間內找到最大水量,這個思路在解決「雙邊界最大化」問題中非常常見,值得我們學習和應用。

希望這篇教學能幫助你掌握 Container With Most Water 題目的解法!

歡迎來到我的部落格!這裡記錄了軟體工程師的日常生活點滴,並分享程式設計與演算法的實用教學。無論你是初學者還是有經驗的開發者,都能在這裡找到深入淺出的技術解析與實戰技巧。此外,我也會分享工作中的心路歷程與學習心得,讓你不僅學到技術,更能瞭解軟體開發的實際應用與挑戰。希望透過這個平台,能與你共同成長,激發對技術的熱情!
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
這篇文章將介紹 LeetCode 題目 10. Regular Expression Matching,這是一道有趣且具有挑戰性的動態規劃題目,涉及實現一個正則表達式匹配算法。這道題目主要考察對正則表達式中的特殊字符 . 和 * 的理解和處理,並運用動態規劃進行高效求解。
這篇文章將介紹 LeetCode 題目 9. Palindrome Number,這是一道簡單但經典的數字題,目標是判斷給定的整數是否為回文數。這道題目可以幫助我們理解數字操作以及回文判斷的基礎邏輯。
這篇文章將介紹 LeetCode 題目 8. String to Integer (atoi),這是一道實現 atoi 函數的題目。此題的核心在於如何解析字串中的數字並轉換成整數,同時需要考慮各種特殊情況和邊界條件。
這篇文章將解析 LeetCode 題目 7. Reverse Integer,這是一道簡單但容易出錯的數字操作題。題目要求將一個整數反轉後返回,並需考慮邊界條件和溢出情況。讓我們逐步解題,並討論不同的解法。
這篇部落格文章將詳細解析 LeetCode 題目 6. Zigzag Conversion。這是一道字串操作題,要求將字串以 "Z" 字形排列,再按行讀取形成新的字串。以下是此題的詳細思路和解法,幫助你有效掌握此類問題。
這篇文章要解說的是 LeetCode 題目 5. Longest Palindromic Substring,這是一道典型的字串題,重點在於找出輸入字串中的最長回文子字串。下面是這篇解題教學的詳細分析與多種解法,讓你能全面掌握這題的技巧。
這篇文章將介紹 LeetCode 題目 10. Regular Expression Matching,這是一道有趣且具有挑戰性的動態規劃題目,涉及實現一個正則表達式匹配算法。這道題目主要考察對正則表達式中的特殊字符 . 和 * 的理解和處理,並運用動態規劃進行高效求解。
這篇文章將介紹 LeetCode 題目 9. Palindrome Number,這是一道簡單但經典的數字題,目標是判斷給定的整數是否為回文數。這道題目可以幫助我們理解數字操作以及回文判斷的基礎邏輯。
這篇文章將介紹 LeetCode 題目 8. String to Integer (atoi),這是一道實現 atoi 函數的題目。此題的核心在於如何解析字串中的數字並轉換成整數,同時需要考慮各種特殊情況和邊界條件。
這篇文章將解析 LeetCode 題目 7. Reverse Integer,這是一道簡單但容易出錯的數字操作題。題目要求將一個整數反轉後返回,並需考慮邊界條件和溢出情況。讓我們逐步解題,並討論不同的解法。
這篇部落格文章將詳細解析 LeetCode 題目 6. Zigzag Conversion。這是一道字串操作題,要求將字串以 "Z" 字形排列,再按行讀取形成新的字串。以下是此題的詳細思路和解法,幫助你有效掌握此類問題。
這篇文章要解說的是 LeetCode 題目 5. Longest Palindromic Substring,這是一道典型的字串題,重點在於找出輸入字串中的最長回文子字串。下面是這篇解題教學的詳細分析與多種解法,讓你能全面掌握這題的技巧。
你可能也想看
Google News 追蹤
Thumbnail
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。
Thumbnail
題目敘述 Combination Sum II_Leetcode #40 給定一個整數陣列candidates 和 目標值target。 每個陣列元素只能選擇一次,請問有多少種組合方法,可以使得組合數總和 = target? 請把滿足組合數總和 = target的組合方法以陣列的形式返回答案
Thumbnail
LeetCode 是一個程式語言版的線上題庫平臺,提供題目描述、程式碼區塊、解題者分享的解法和疑問討論。藉由這篇文章分享我在 LeetCode 上的使用經驗和觀點,包括刷題的重要性、解題心態和練習目標。
Thumbnail
題目敘述 Solving Questions With Brainpower 給定一個測驗題陣列,每個欄位都是一個pair, 分別記錄測驗題做完可以得到的分數,和需要的冷卻時間 (也就是會有一段時間不能作答接下來的題目)。 請問在最佳的答題策略下,最多可以獲得多少分數?
Thumbnail
題目敘述 題目會給我們一個輸入陣列nums,每個元素值代表那個格子點可以左右位移的固定長度。 例如,假設 nums[i] = 3,那麼下一步可以移動到nums[i-3] 或 nums[i+3]這兩個格子點。 題目​會給定一個起始點start索引位置,請問我們能不能走到內部數值為0的格子點?
Thumbnail
題目敘述 題目會給我們一個輸入陣列nums,每個元素值代表那個格子點可以跳躍的最大長度。 題目保證始從最左邊的格子點出發開始跳,一定可以成功抵達終點,請問最少跳躍次數是說少? 題目的原文敘述 測試範例 Example 1: Input: nums = [2,3,1,1,4] Outp
Thumbnail
題目敘述 題目會給我們一個輸入陣列nums,每個元素值代表那個格子點可以跳躍的最大長度。 一開始從最左邊的格子點出發開始跳,請問可以成功抵達終點,也就是最右邊的格子點嗎? 如果可以,返回 True。 如果不行,返回False。 題目的原文敘述 測試範例 Example 1: In
Thumbnail
題目敘述 題目的情境是設計並且實現一個包含所有正整數的數據流,以set集合的方式存在。 數據流 = {1, 2, 3, 4, ..., ∞} 要求我們去實現定義好的function介面: SmallestInfiniteSet()建構子,初始化這個包含所有正整數的數據流。 int po
Thumbnail
這題也是滿經典的DP動態規劃教學案例和題目,就順便複習一下吧。 題目敘述 題目會給我們兩個字串text1, text2。 要求我們找出兩個字串的最長共同子序列,並且返回最長共同子序列的長度。 如果彼此沒有共同子序列,則返回0。 題目的原文敘述 測試範例 Example 1: In
Thumbnail
題目敘述 題目會給我們一個隔板陣列height,代表每個隔板的高度,讓我們選取兩個隔板作為水槽的邊界,請問最多我們能裝多少水? 題目的原文敘述 測試範例 Example 1: Input: height = [1,8,6,2,5,4,8,3,7] Output: 49 Explanati
Thumbnail
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。
Thumbnail
題目敘述 Combination Sum II_Leetcode #40 給定一個整數陣列candidates 和 目標值target。 每個陣列元素只能選擇一次,請問有多少種組合方法,可以使得組合數總和 = target? 請把滿足組合數總和 = target的組合方法以陣列的形式返回答案
Thumbnail
LeetCode 是一個程式語言版的線上題庫平臺,提供題目描述、程式碼區塊、解題者分享的解法和疑問討論。藉由這篇文章分享我在 LeetCode 上的使用經驗和觀點,包括刷題的重要性、解題心態和練習目標。
Thumbnail
題目敘述 Solving Questions With Brainpower 給定一個測驗題陣列,每個欄位都是一個pair, 分別記錄測驗題做完可以得到的分數,和需要的冷卻時間 (也就是會有一段時間不能作答接下來的題目)。 請問在最佳的答題策略下,最多可以獲得多少分數?
Thumbnail
題目敘述 題目會給我們一個輸入陣列nums,每個元素值代表那個格子點可以左右位移的固定長度。 例如,假設 nums[i] = 3,那麼下一步可以移動到nums[i-3] 或 nums[i+3]這兩個格子點。 題目​會給定一個起始點start索引位置,請問我們能不能走到內部數值為0的格子點?
Thumbnail
題目敘述 題目會給我們一個輸入陣列nums,每個元素值代表那個格子點可以跳躍的最大長度。 題目保證始從最左邊的格子點出發開始跳,一定可以成功抵達終點,請問最少跳躍次數是說少? 題目的原文敘述 測試範例 Example 1: Input: nums = [2,3,1,1,4] Outp
Thumbnail
題目敘述 題目會給我們一個輸入陣列nums,每個元素值代表那個格子點可以跳躍的最大長度。 一開始從最左邊的格子點出發開始跳,請問可以成功抵達終點,也就是最右邊的格子點嗎? 如果可以,返回 True。 如果不行,返回False。 題目的原文敘述 測試範例 Example 1: In
Thumbnail
題目敘述 題目的情境是設計並且實現一個包含所有正整數的數據流,以set集合的方式存在。 數據流 = {1, 2, 3, 4, ..., ∞} 要求我們去實現定義好的function介面: SmallestInfiniteSet()建構子,初始化這個包含所有正整數的數據流。 int po
Thumbnail
這題也是滿經典的DP動態規劃教學案例和題目,就順便複習一下吧。 題目敘述 題目會給我們兩個字串text1, text2。 要求我們找出兩個字串的最長共同子序列,並且返回最長共同子序列的長度。 如果彼此沒有共同子序列,則返回0。 題目的原文敘述 測試範例 Example 1: In
Thumbnail
題目敘述 題目會給我們一個隔板陣列height,代表每個隔板的高度,讓我們選取兩個隔板作為水槽的邊界,請問最多我們能裝多少水? 題目的原文敘述 測試範例 Example 1: Input: height = [1,8,6,2,5,4,8,3,7] Output: 49 Explanati