题目传送门:
11. 盛最多水的容器 - 力扣(LeetCode)https://leetcode.cn/problems/container-with-most-water/description/思路:
这种最优解题目,一般涉及到贪心。要找两条线,为提高效率,选择使用双指针而不是暴力
v = min(h[l], h[r]) * (r - l)
贪心策略:
我们每次将 l 或 r 移动一步,思考如何使得 v 尽可能地大
无论是移动一步 l 还是移动一步 r,(r - l) 都是一样的
关键在于 min() 中的内容。假设 h[l] 大 h[r] 小,min() 返回 h[r]
此时若移动 l,h[l] 如果仍 >= h[r],那 min() 还是返回 h[r],v 变小
h[l] 如果 < h[r],min() 返回 h[l],v 变小
即,移动 l,v 只可能变小
此时若移动 r,h[r] 如果仍 <= h[l],那 min() 还是返回 h[r],v 变小
h[r] 如果 >= h[l],min() 返回 h[l],v 有可能变大
即,移动 r,v 有可能变大
总结:移动 l,v 只会变小。移动 r,v 有可能变大
显然,我们每次移动的都是较小的那个,这样才有可能使得 v 尽可能地大
代码:
class Solution
{
public:
int maxArea(vector<int>& height)
{
int l = 0, r = height.size() - 1, ret = 0;
while (l < r)
{
ret = max(ret, min(height[l], height[r]) * (r - l));
if (height[l] < height[r]) l++;
else r--;
}
return ret;
}
};