LeetCode 11 盛最多水的容器(数组、双指针)

16 篇文章 0 订阅

题目要求:

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

说明:你不能倾斜容器,且 n 的值至少为 2。

图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

 

示例:

输入: [1,8,6,2,5,4,8,3,7]
输出: 49

 

 

 

C++代码:

 

class Solution {
public:
    int maxArea(vector<int>& height) {
        int water = 0;
        int i =0 , j = height.size()-1;
        while(i < j){
            int h = min(height[i],height[j]);
            water = max(water,(j-i)*h);
            while(height[i] <= h  && i < j)
                i++;
            while(height[j] <= h  && i < j)
                j--;
        }
        return water;
    }
};

 

 

 

结果:

论坛看到的方法,这效果也忒好了吧!!

链接如下:

https://leetcode.com/problems/container-with-most-water/discuss/6090/Simple-and-fast-C++C-with-explanation

 

 

 

解析:

论坛原文是这样解释的:

Start by evaluating the widest container, using the first and the last line. All other possible containers are less wide, so to hold more water, they need to be higher. Thus, after evaluating that widest container, skip lines at both ends that don't support a higher height. Then evaluate that new container we arrived at. Repeat until there are no more possible containers left.

即先计算最宽的容器,使用第一行和最后一行。其他所有可能的容器都没这么宽,然后所以为了可以容纳更多的水,我们需要使得高度更高。因此,在评估最宽的容器之后,在两端跳过不支持较高高度的h。然后评估我们到达的新容器。重复这样做,直到没有可能的容器剩下。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值