給定一個整數陣列 height,每個值代表對應位置上的垂直線高度,這些垂直線與 x 軸形成容器。請找到兩條垂直線,與 x 軸組成一個容器,該容器可以儲存的最多水量。容器的水量由兩條垂直線之間的最短線高度決定,乘以它們之間的距離。
範例 1:
範例 2:
這道題的關鍵是如何找到兩條垂直線,使得它們組成的容器面積最大。容器的面積可以表示為兩條垂直線的高度中的較小值,乘以它們之間的距離。
我們可以使用雙指針法來高效地解決這個問題。具體步驟如下:
這樣的雙指針法能夠將問題從暴力枚舉的𝑂(𝑛^2)降低到𝑂(𝑛)的時間複雜度。
class Solution {
public:
int maxArea(vector<int>& height) {
int left = 0, right = height.size() - 1; // 左右指針
int max_area = 0; // 儲存最大面積
// 雙指針法
while (left < right) {
// 計算目前兩條線形成的面積
int h = min(height[left], height[right]);
int area = h * (right - left);
max_area = max(max_area, area);
// 移動較短的指針
if (height[left] < height[right]) {
left++;
} else {
right--;
}
}
return max_area;
}
};
雙指針初始化:
迴圈處理:
時間複雜度:
這題的重點在於如何通過雙指針法來有效地計算出最大儲水容器的面積。這種方法的優勢在於它能夠在不需要暴力枚舉的情況下,以線性時間解決問題。雙指針的策略是基於面積的公式和容器的性質,即面積由兩條邊的較小值決定,因此每次移動較短的一邊來獲得更好的結果。
以上是第八天的自學內容分享,謝謝大家。