leetcode | Medium | 11.Container With Most Water

閱讀時間約 5 分鐘
在 LeetCode 上的這個問題「Container With Most Water」要求我們在一個陣列中找到兩個柱子,這兩個柱子可以組成一個「容器」,而這個容器能容納最多的水。
每個柱子的高度由陣列 height[] 中的值決定,而容器的寬度則是這兩個柱子之間的距離(索引差)。要找到最大容積的容器,我們要計算容器的「容量」,公式為:
容量 = min(柱子1的高度, 柱子2的高度) * 柱子1和柱子2之間的寬度

第一種解法:直觀解法(Brute Force)

這個方法比較直觀,就是用兩個迴圈暴力地計算每對柱子的容器容量,並找出最大值。

  1. 用兩個迴圈,第一個迴圈選擇柱子1,第二個迴圈選擇柱子2。
  2. 計算兩個柱子組成容器的容量。
  3. 保存最大容量。

時間複雜度:O(n^2)

這是因為我們要遍歷陣列中的每一對柱子,時間複雜度是平方級的。

C++程式碼:

class Solution {
public:
int maxArea(vector<int>& height) {

int maxArea = 0;
int n = height.size();

// 雙迴圈遍歷每對柱子
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
// 計算這對柱子的容積
int area = min(height[i], height[j]) * (j - i);
// 更新最大容積
maxArea = max(maxArea, area);
}
}

return maxArea;
}
};

解釋:

  • 外層迴圈選擇柱子1,內層迴圈選擇柱子2。
  • 每次計算容量,並更新最大容量 maxArea
  • 雖然這種方法很容易理解,但效率較低。

第二種解法:雙指針法(Optimal Solution)

優化的解法可以使用「雙指針」,時間複雜度為 O(n)。

  1. 設定兩個指針,一個指向陣列的最左端(柱子1),另一個指向陣列的最右端(柱子2)。
  2. 每次計算這兩個柱子組成的容器容量,並嘗試更新最大容量。
  3. 移動較矮的那個柱子指針,因為只有移動較矮的柱子才有可能找到更大的容量。

時間複雜度:O(n)

這是因為我們只需要遍歷陣列一次,每次根據柱子的高度移動指針。

C++程式碼:

class Solution {
public:
int maxArea(vector<int>& height) {
int maxArea = 0;
int left = 0; // 左指針
int right = height.size() - 1; // 右指針

while (left < right) {
// 計算當前容器的容量
int area = min(height[left], height[right]) * (right - left);
// 更新最大容積
maxArea = max(maxArea, area);

// 移動較矮的柱子
if (height[left] < height[right]) {
++left;
} else {
--right;
}
}

return maxArea;
}
};

解釋:

  • 我們從兩端開始,利用兩個指針 leftright 計算當前容器的容量。
  • 每次移動指針時,只移動較矮的那一端,這樣做是因為我們嘗試增大容器的容量(移動較矮的那端有可能找到更高的柱子)。
  • 最後當指針相遇時,我們就得到了最大容積。

以上是 Hua 在 LeetCode 的解題分享,有想法或是建議歡迎在底下討論。
Day Day Good, Day Day Up !

9會員
8內容數
成功考上研究所,當面對大量的文獻資源時,你可能感到茫然不知如何開始閱讀,也或許不確定該如何開始撰寫畢業論文。在這裡,我將與你分享一些與做研究相關的實用技巧,期望這份指南能夠為初次踏入研究領域的新手帶來實質的協助。
留言0
查看全部
發表第一個留言支持創作者!
Hua的沙龍 的其他內容
你是否曾經聽過有人能夠倒著說話?這不僅僅是一種派對技藝,還涉及深刻的神經認知過程。本研究探索了兩位能夠熟練倒說話的專家,分析了他們在行為和大腦結構上的特徵,揭示了這一非凡技能背後的秘密。
一直重複,會是什麼感覺?你是否曾在罰寫的過程中,感到不對勁?又或者,默寫時漸漸對單字感到陌生?2023年搞笑諾貝爾文學獎的獲獎研究,或許可以解答你的疑惑。
世界無奇不有,學術也不例外。研究發現,缺乏吸引力的基金經理相較於具有吸引力的,投資表現每年高出約2%!
就像考試有撇步,論文閱讀也有適用的方法。這篇文章將分享一套簡單的三步驟讀論文方法,快速理解論文架構並深入瞭解研究主題。
你是否曾經聽過有人能夠倒著說話?這不僅僅是一種派對技藝,還涉及深刻的神經認知過程。本研究探索了兩位能夠熟練倒說話的專家,分析了他們在行為和大腦結構上的特徵,揭示了這一非凡技能背後的秘密。
一直重複,會是什麼感覺?你是否曾在罰寫的過程中,感到不對勁?又或者,默寫時漸漸對單字感到陌生?2023年搞笑諾貝爾文學獎的獲獎研究,或許可以解答你的疑惑。
世界無奇不有,學術也不例外。研究發現,缺乏吸引力的基金經理相較於具有吸引力的,投資表現每年高出約2%!
就像考試有撇步,論文閱讀也有適用的方法。這篇文章將分享一套簡單的三步驟讀論文方法,快速理解論文架構並深入瞭解研究主題。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
題目敘述 Combination Sum II_Leetcode #40 給定一個整數陣列candidates 和 目標值target。 每個陣列元素只能選擇一次,請問有多少種組合方法,可以使得組合數總和 = target? 請把滿足組合數總和 = target的組合方法以陣列的形式返回答案
Thumbnail
LeetCode 是一個程式語言版的線上題庫平臺,提供題目描述、程式碼區塊、解題者分享的解法和疑問討論。藉由這篇文章分享我在 LeetCode 上的使用經驗和觀點,包括刷題的重要性、解題心態和練習目標。
Thumbnail
題目敘述 Solving Questions With Brainpower 給定一個測驗題陣列,每個欄位都是一個pair, 分別記錄測驗題做完可以得到的分數,和需要的冷卻時間 (也就是會有一段時間不能作答接下來的題目)。 請問在最佳的答題策略下,最多可以獲得多少分數?
Thumbnail
題目敘述 題目會給我們一個輸入陣列arr,起始點固定在索引為0的位置, 終點固定在索引為n-1的位置。 假設當下所在的索引位置為i,那麼每次移動的時候,可以跳到i-1,i+1,或者其他和我有相同元素值的位置arr[j], where arr[j] = arr[i]。 例如: 假設當下在i=3
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
題目敘述 題目會給我們一個二維陣列matrix,分別代表每個格子的成本,請問我們從最頂端到底部的下墜路徑的最小成本總和是多少? 每次下墜到下一排的時候,可以有三種選擇: 1.往左下角移動。 2.往正下方移動。 3.往右下角移動。 題目的原文敘述 測試範例 Example 1:
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
題目敘述 Combination Sum II_Leetcode #40 給定一個整數陣列candidates 和 目標值target。 每個陣列元素只能選擇一次,請問有多少種組合方法,可以使得組合數總和 = target? 請把滿足組合數總和 = target的組合方法以陣列的形式返回答案
Thumbnail
LeetCode 是一個程式語言版的線上題庫平臺,提供題目描述、程式碼區塊、解題者分享的解法和疑問討論。藉由這篇文章分享我在 LeetCode 上的使用經驗和觀點,包括刷題的重要性、解題心態和練習目標。
Thumbnail
題目敘述 Solving Questions With Brainpower 給定一個測驗題陣列,每個欄位都是一個pair, 分別記錄測驗題做完可以得到的分數,和需要的冷卻時間 (也就是會有一段時間不能作答接下來的題目)。 請問在最佳的答題策略下,最多可以獲得多少分數?
Thumbnail
題目敘述 題目會給我們一個輸入陣列arr,起始點固定在索引為0的位置, 終點固定在索引為n-1的位置。 假設當下所在的索引位置為i,那麼每次移動的時候,可以跳到i-1,i+1,或者其他和我有相同元素值的位置arr[j], where arr[j] = arr[i]。 例如: 假設當下在i=3
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
題目敘述 題目會給我們一個二維陣列matrix,分別代表每個格子的成本,請問我們從最頂端到底部的下墜路徑的最小成本總和是多少? 每次下墜到下一排的時候,可以有三種選擇: 1.往左下角移動。 2.往正下方移動。 3.往右下角移動。 題目的原文敘述 測試範例 Example 1: