[LeetCode]11. 盛最多水的容器

11. 盛最多水的容器

给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2。
<img src="", width="50%"

解题思路: 本题要求的是找两个柱子,使两个柱子盛的水最多,最简单的方法是采取暴力解法,以 O ( n 2 ) O(n^2) O(n2)的时间复杂度遍历所有的可能,即可得到最大值。但是这个时间复杂度是不可接受的,因此我们还需要再想办法,我们先观察这个最大值可以怎么取得,或者说这个最大值由那几个因素解决,由两个柱子height最小值和两个柱子在横轴方向上的间距决定,本题的标签是双指针,那么双指针解法中双指针的移动要么同向移动,要么相向移动,此题若选择同向移动,其实不能很好处理当获取一个值后下一步指针该怎么移动的问题,那么相向移动,双指针从两端向中间移动,接下来我们讨论指针怎么移动的问题,即左边界指针右移和右边界指针左移,根据短板效应可知,我们更愿意选择留下长边,因为选择短边意味着接下来无论选取什么边界值,总的收益总是想着减少的方向倾斜,那么问题就解决了,当我们移动边界时,选较小的边界的指针进行移动。

// 类型:双指针
// 从两端向中间进行遍历,记录出现的最大值,
// 接下来解决的问题是,左边界移动?还是右边界移动?
// 根据短板效应知,短板影响整体效果,因此我们尽量保留
// 长板,尽可能提升整体效果,因此哪个边界对应的height小,
// 就移动哪个边界
// Time:O(n), Space:O(1)
class Solution {
public:
    int maxArea(vector<int>& height) {
        int i = 0, j = height.size() - 1;
        int res = 0;
        while (i < j) {
            res = max(res, min(height[i], height[j]) * (j - i));
            if (height[i] > height[j]) --j;
            else ++i;
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值