题目
分析
也是LC很经典很老的一道题目了,考察的是双指针。能用双指针的原因基于这样的一个规则,那就是矩形的左右从两边往中间靠拢的时候,底边的长度是一定减少的,所以一开始最左边和最右边所形成的矩形的底边是最长的。那如果存在比这个大的矩形,就意味着中间一定有更高的柱子来弥补底边长度减少带来的面积损失。所以我们只需要用双指针从左和右往中间移动,移动的方法就是left和right所在柱子中,较短的那根移动,比方说图中的例子,开始左边在下标0,右边在下标8,高度分别是1和7,由于木桶效应,1决定了面积的短板,如果我们移动right,那既是right所在高度变高,由于1的短板,矩形高度还是在1,而底边变短,所以得到的面积肯定更小,这就是为什么需要移动较低的那根柱子下标。下面来看代码
代码
class Solution {
public:
int maxArea(vector<int>& height) {
if (height.empty()) return 0;
int left = 0, right = height.size() - 1, ans = 0;
while (left < right) {
ans = max(ans, min(height[left], height[right]) * (right - left));
if (height[left] < height[right]) left++;
else right--;
}
return ans;
}
};