题解 力扣 LeetCode 11 盛最多水的容器 贪心 双指针 对撞指针 C++

题目传送门:

11. 盛最多水的容器 - 力扣(LeetCode)icon-default.png?t=O83Ahttps://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;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值