LeetCode 11

这道题其实不难,但是需要注意题目的要求,理解题目意思很重要! 首先我来说说题目意思吧,这道题是给你n个数,

存在vector中,每个数和其下标组成一个坐标(i,ai),要求其中两个点以及他们与x轴的垂线以及x轴三线组成的图形的能装

下多少水。注意,这不是求面积!,我画个图分析一下吧

我们要求的是矩形的面积,而不是梯形的面积,这和生活有一定联系吧,倾斜的水会洒出来的,所以我们需要求什么已经很清楚了,于是我们可以写出下面的代码:

class Solution {
public:
    int maxArea(vector<int>& height) {
        int num = height.size(); 
        if(num < 2)
        {
            return 0;
        }
        int maxcontain = 0;
        /*
          从两边向中间逼近,设wid = end -begin , high = min(height[begin,end]) ,那么最大容量为contain = wid*high 
          要想contain最大,那么wid和high都要尽量的大才能保证,所以我决定采用从两边向中间逼近的方法去测试wid和high的
          乘积的最大值,这样时间复杂度比较小,想一想两个for循环的写法,真的很低效。
        */
        int begin =0;
        int end = num-1;
        while(begin < end)
        {
            int tmp = (end-begin)*min(height[begin],height[end]);
            maxcontain = maxcontain > tmp ? maxcontain:tmp;
            if(height[begin] >= height[end])
            {
                --end;
            }
            else
            {
                ++begin;
            }
        }
        return maxcontain;
    }
};
以上的代码的思路在代码也说明了,大家应该能理解,这道题我们不能使用两个for循环去解题的,因为效率太低了O(n^2)。我们是从两边向中间去探索,这样底部的长度在不断减小,找到两个高度很高的值有可能就是答案,所以就是这样解题的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值