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;
}
};

浙公网安备 33010602011771号