在 LeetCode 上的這個問題「Container With Most Water」要求我們在一個陣列中找到兩個柱子,這兩個柱子可以組成一個「容器」,而這個容器能容納最多的水。
每個柱子的高度由陣列height[]
中的值決定,而容器的寬度則是這兩個柱子之間的距離(索引差)。要找到最大容積的容器,我們要計算容器的「容量」,公式為:容量 = min(柱子1的高度, 柱子2的高度) * 柱子1和柱子2之間的寬度
這個方法比較直觀,就是用兩個迴圈暴力地計算每對柱子的容器容量,並找出最大值。
這是因為我們要遍歷陣列中的每一對柱子,時間複雜度是平方級的。
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;
}
};
maxArea
。優化的解法可以使用「雙指針」,時間複雜度為 O(n)。
這是因為我們只需要遍歷陣列一次,每次根據柱子的高度移動指針。
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;
}
};
left
和 right
計算當前容器的容量。以上是 Hua 在 LeetCode 的解題分享,有想法或是建議歡迎在底下討論。
Day Day Good, Day Day Up !