题意就是找到面积最大的一块,暴力还是同样的o(n2)但是n取到了1e5,所以暴力会超时,考虑双指针算法,这里的双指针需要找到性质。如图所示两根红色的柱子,较小的是右边的,无论左边的柱子换成多高都不会超过现在的面积,有点类似木桶效应。所以我们需要移动较小的柱子才可能找到更大的面积,双指针分别指向两边,每次移动更矮的柱子直到指针相遇即可。
class Solution {
public:
int maxArea(vector<int>& height) {
int i=0,j=height. Size()-1;
int ans=0;
while(i<j)
{
int maps=(j-i)*min(height[i],height[j]);//面积
ans=max(ans,maps);
height[i]<height[j]?i++:j--;//左边小就i++,右边小就j--,一样大就挪一遍即可
}//如果不动小的就不会改变最大值
return ans;
}
};