LeetCode HOT100 - 盛最多水的容器

首先我们找比较特殊的点

考虑一个元素,我们不去看那些比它小的元素的话,那么它的最大答案是最远的大于它的和它构成容器

这是因为答案计算的方式是 min(a[l], a[r]) * (r - l)

进一步的结论是比如我们考虑的元素的下标是 r,找到的那个元素的下标是 l,那么 [l, r) 中的元素一定不会比上面那个答案更优

而小于 l 的那些元素我们只能遍历判断答案会不会更优

这是不是就有些双指针的样子了

换句话就是如果当前 a[l] >= a[r] ,那么实际上我们 r 可以直接左移,因为左端点不会有和这个 r 匹配还能使答案变大了

那么我们 r 移到什么位置呢,那就是移到比 l 大为止,再开始固定 r ,移动 l ,然后这种途中一直计算答案并进行更新

class Solution {
public:
    int maxArea(vector<int>& a) {
        int n = a.size();
        int ans = 0;
        int l = 0, r = n - 1;
        while (l < r) {
            ans = max(ans, min(a[l], a[r]) * (r - l));
            // cout << l << ' ' << r << ' ' << min(a[l], a[r]) * (r - l) << '\n';
            if (a[l] >= a[r]) {
                while (l < r && a[l] >= a[r]) {
                    r--;
                    ans = max(ans, min(a[l], a[r]) * (r - l));
                }
            } else {
                while (l < r && a[r] >= a[l]) {
                    l++;
                    ans = max(ans, min(a[l], a[r]) * (r - l));
                }
            }
        }
        return ans;
    }
};
posted @ 2026-04-25 23:41  rdcamelot  阅读(24)  评论(0)    收藏  举报