题目
给定一个长度为 n
的整数数组 height
。有 n
条垂线,第 i
条线的两个端点是 (i, 0)
和 (i, height[i])
。
找出其中的两条线,使得它们与 x
轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
思路
-
双指针法:
- 使用两个指针:一个指向数组的开始(左边),一个指向数组的结束(右边)。
- 每次计算由当前两个指针所形成的水面积,面积的计算公式为:
- 然后根据柱子的高度,决定移动哪一个指针:
- 如果
height[i] < height[j]
,则移动左指针i
向右;这样可能会找到更高的柱子。 - 如果
height[j] ≤ height[i]
,则移动右指针j
向左;同样可能会找到更高的柱子。
- 如果
- 继续这个过程,直到两个指针相遇。
-
计算最大面积:
- 在每次移动指针时,更新当前的最大水面积。
复杂度分析
-
时间复杂度:
- 在最坏情况下,每个指针最多遍历整个数组一次,因此时间复杂度为 O(n)其中 n 是数组
height
的长度。
- 在最坏情况下,每个指针最多遍历整个数组一次,因此时间复杂度为 O(n)其中 n 是数组
-
空间复杂度:
- 只使用了常量数量的额外空间来存储指针和最大水面积的值,因此空间复杂度为 O(1)。
代码
class Solution {
public:
int maxArea(vector<int>& height) {
int n=height.size();
int i=0,j=n-1;
int maxWater=0;
while(i<j){
maxWater=max(maxWater,(j-i)*min(height[i],height[j]));
if(height[i]<height[j]){
i++;
}
else{
j--;
}
}
return maxWater;
}
};