暴力
枚举每个点,复杂度O(n^2)
双指针
暴力会有一些不优的情况,本可以排除掉。
假设左端点是l,右端点是r,答案是 min(h[l] , h[r])(r - l)。如果h[l] < h[r] ,将右端点向左移动一下的话,假设h[r-1] <= h[r],向左移动面积必然减小。若h[r-1] > h[r],min(h[l],h[r-1])不变,距离减小,面积还是减小。所以在h[l] < h[r]的情况下,右端点再向左扫描就没有意义了。因此倒不如记录下当前的答案,因为max(ans,h[l](r-l)) 是以 l 为端点的情况的最优解了,然后向右移动左端点,继续找答案。
代码
class Solution {
public:
int maxArea(vector<int>& height) {
int l = 0,r = height.size()-1,ans = 0;
while(l < r){
ans = max(ans,min(height.at(l),height.at(r))*(r-l));
if(height.at(r) >= height.at(l)){
++l;
}
else{
--r;
}
}
return ans;
}
};