leetcode 盛最多水的容器 中等

 

 

双指针,起初 l = 0, r = height.size() - 1,双指针的移动方案是:谁矮移动谁。

area = min(height[l], height[r]) * (r - l),其中 (r - l) 的值肯定是减少,要增加 area 只有一种方式 (只有一种!!),那就是移动 height[l] 与 height[r] 中小的那一个!!

虽然 area 有可能会更小,但是 答案是取 max,并不影响。。

 

当然,也有其他方案:对于一个板来说,假设它是高度的决定因素,那么只需要找到其右边最后一个大于等于它的数即可,左边同理!!

所以枚举每个数,假设它是高度的决定与因素就行了。右边最后一个大于等于它的数,可以用线段树搞定。时间复杂度 nlogn

class Solution {
public:
    int maxArea(vector<int>& height) {
        int res = 0;
        for(int l = 0, r = height.size() - 1; l < r; ) {
            res = max(res, (r - l) * min(height[l], height[r]));
            height[l] < height[r] ? ++ l : -- r;
        }
        return res;
    }
};

 

posted @ 2021-07-26 23:02  rookie_Acmer  阅读(28)  评论(0)    收藏  举报