LeetCode 11 盛水最多的容器

暴力

枚举每个点,复杂度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;
    }
};
岂能尽如人意,但求无愧我心
原文地址:https://www.cnblogs.com/Zforw/p/13406616.html