力扣11.盛最多水的容器

本文介绍了一种使用双指针法解决计算机算法问题的实例,具体是找到一组非负整数数组中能形成最大水量的两个竖线。通过从数组两端开始并逐步向中间收敛,不断更新最大水量,最终找到最优解。这种方法巧妙地利用了最短木板原理,适合于处理这类二维数组的问题。
摘要由CSDN通过智能技术生成

题目描述:

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

解题思路:

这里用双指针法。

算法思路:

用两个指针l,r指向数组的头和尾:

int l = 0,r = height.size()-1;

定义一个变量用来保存最后的结果,初始化为0:

int ans = 0;

接下来就是寻找最大容量的过程了,类似最短木板,即最大容量取决于最短的那块木板,这里的容量实际为矩形的面积,等于左右指针的距离乘以左右指针中较小者的值,因此可以写出如下代码

int area = min(height[l],height[r])*(r-l);
//这里用area来保存在寻找过程中每一步的容量值

寻找过程

在寻找过程中,由于是寻找最大容量,因此如果左指针的值小于右指针的值,左指针就要往右移 一位,右指针小的话右指针就要左移。直到左指针和右指针相遇

 while(l<r)//寻找的条件为左指针小于右指针
        {
            int area = min(height[l],height[r])*(r-l);//用area来保存每次的容量。
            ans=max(ans,area);//ans保存最大容量
            if(height[l]<=height[r])
            {
                ++l;//如果左指针小,左指针右移一位,以寻求较大值
            }
            else
            {
                --r;如果右指针小,右指针左移一位,以寻求较大值
            }

        } 

最后返回ans

return ans;

整体代码如下:

class Solution {
public:
    int maxArea(vector<int>& height) {
        int l = 0,r = height.size()-1;
        int ans = 0;
        while(l<r)
        {
            int area = min(height[l],height[r])*(r-l);
            ans=max(ans,area);
            if(height[l]<=height[r])
            {
                ++l;
            }
            else
            {
                --r;
            }

        } 
        return ans;
    }
};

感想:

所谓解题思路解题思路是解过了才有思路,这题不算复杂,但看到了就是没有思路,还是练习少了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值