iT邦幫忙

2025 iThome 鐵人賽

DAY 11
0
自我挑戰組

用java解Leetcode系列 第 11

用java解Leetcode Day11

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20250925/20169501v6MFuIMhU0.pnghttps://ithelp.ithome.com.tw/upload/images/20250925/20169501y2xZifBr3u.png

  1. Container With Most Water

這題的目標是從給定的非負整數陣列height中,找到兩條垂直線,使它們與x軸圍成的容器能裝最多的水。容器的容量由兩條線的最短高度和它們之間的寬度(索引差)決定。

這題的解題方法有兩個,其中一個是暴力法,也就是雙重迴圈,去計算所有可能的兩條線組成的容器面積,然後取最大值。這個方法的時間複雜度為O(n^2),在n達到10^5的情況下會超時,所以我選擇另一個方法:雙指針法(Two Pointers)。

這個方法的思路是先初始化:設置兩個指針,一個在最左邊(left = 0),一個在最右邊(right = n -1),設置完成後,就要初始化最大面積maxArea = 0。
接著,移動指針,在left < right的條件下迴圈:計算當前兩條線所圍成的容器面積:area = min(height[left], height[right]) * (right - left)。計算完後,更新最大面積:max(maxArea, area)。關鍵在於,為了尋找更大的面積,需要移動哪一個指針?因為容器的寬度(right - left)正在不斷減小,要使面積增加,必須尋找更高的邊界,所以,要移動高度較低的那個指針。如果height[left] < height[right],移動左指針left++;如果height[right] <= height[left],移動右指針right--。這個邏輯的原理是:如果移動高度較高的那條線,寬度會減小,但高度上限不會增加(因為它是由較矮的線決定的),因此面積只會變小。而移動較矮的那條線,雖然寬度也減小,但有機會找到一條更高的線,從而獲得更大的面積。
當left和right指針相遇或交叉時(left >= right),所有可能的組合都已檢查完畢,迴圈結束。這就是程式的結束條件。

這個雙指針解法的時間複雜度為O(n),因為只用了一個迴圈,且每個指針最多只會遍歷陣列一次。空間複雜度為O(1),因為只使用了幾個固定的變數來儲存指針和最大面積。


上一篇
用java解Leetcode Day10
下一篇
用java解Leetcode Day12
系列文
用java解Leetcode14
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言