这题和接雨水非常的像啊,但考虑的是两个柱子间能接的最多水。
在接雨水问题中,我们可以通过双指针维护两边的最大值得到每个柱子上面的水量。因为接雨水求的是两边最大值的最小值。
考虑此题的暴力做法,由于只需要考虑两根柱子,所以
O
(
N
2
)
O(N^2)
O(N2)肯定可以解决。
考虑完暴力做法你会发现,此题和接雨水没有半毛钱关系,建模也完全不一样。
接下来直接给出此题解法:双指针,无需维护最大值,考虑两个指针大小,小的往中间移
道理:此种解法相当于排除了大的移动的可能性。
咱们假设左边小,右边大,那此时左边的已经没有存在的必要了。假设右边的往左移动一位,移动后的位置如果比x大,那么高度一样,宽度减少。如果比x小,那么高度减少,宽度也减少。所以小的位置必须要移动。
代码如下:
class Solution {
public:
int maxArea(vector<int>& height) {
int n = height.size();
int l = 0, r = n-1;
int ans = 0;
while(l<r)
{
if(height[l] < height[r])
{
ans = max(ans, height[l]*(r-l));
l++;
}
else
{
ans = max(ans, height[r]*(r-l));
r--;
}
}
return ans;
}
};