題目 #
leetcode 11 - Container With Most Water (題目說明請點連結)
題目簡述 #
給定一個表示容器高度的陣列,找出兩個高度線與x軸圍成的容器能盛裝的最大水量。
Example 1:
Input: height = [1,8,6,2,5,4,8,3,7]
Output: 49
Explanation: 最大面積是通過選擇 height[1] = 8 和 height[8] = 7 得到的。面積 = 8 × 7 = 49。Example 2:
Input: height = [1,1]
Output: 1
Explanation: 最大面積是通過選擇 height[0] = 1 和 height[1] = 1 得到的。面積 = 1 × 1 = 1。解題思路 #
問題理解 #
給定一個表示容器高度的陣列,找出兩個高度線與x軸圍成的容器能盛裝的最大水量。
容器的面積 = 寬度 × 高度,其中:
- 寬度 = 兩個指針之間的距離
- 高度 = 兩個指針指向的較小值(因為水會從較低的一側溢出)
使用 Two Pointers,從陣列兩端開始向中間移動:
- 左指針
left從陣列開頭開始 - 右指針
right從陣列結尾開始 - 每次移動較小高度的指針(因為較小高度限制了容器的最大可能面積)
- 初始化左右指針和最大面積
- 計算當前面積:
(right - left) × min(height[left], height[right]) - 比較左右指針的高度:
- 如果
height[left] < height[right]:移動左指針 - 如果
height[left] >= height[right]:移動右指針
- 如果
- 更新最大面積
- 重複步驟2-4直到指針相遇
完整程式碼 #
java
class Solution {
public int maxArea(int[] height) {
int left = 0; // 初始化左指針
int right = height.length - 1; // 初始化右指針
int maxArea = 0; // 初始化最大面積
while (left < right) { // 當左右指針未相遇時繼續
int area = (right - left) * Math.min(height[left], height[right]); // 計算當前面積
if (height[left] > height[right]) { // 如果左側高度大於右側
right--; // 移動右指針
} else { // 如果右側高度大於等於左側
left++; // 移動左指針
}
if (area > maxArea) { // 如果當前面積大於最大面積
maxArea = area; // 更新最大面積
}
}
return maxArea; // 返回最大面積
}
}時間複雜度 #
- 時間複雜度:O(n),其中 n 是數組的長度
- 空間複雜度:O(1),只使用了常數額外空間