#leetcode刷题之路11-盛最多水的容器

给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (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

 

暴力法太没意思了;这其实就是个求面积的问题.

我们看能否使用技巧来解决这个问题:

1.首先,显而易见,最终肯定选择的是这么多柱子中的两个,这两个柱子的关系是一个在左一个在右,因此,所以我们可以设计两个指针(begin,end)分别从两头向中间移动,分别找到左右这俩柱子。

2.那么如何移动呢?我们把初始的指针放在两头。这就围成了一个初始的矩形面积area=短的柱子(假设是begin)长度*(end-begin)。那么接下来该让哪一个指针往中间移动一小步呢?

  2.1如果移动高的柱子(假设是end)那个指针,

    2.1.1如果指针移动到了一个比柱子(begin)高的柱子上,此时面积area=短的柱子(begin)长度*(end-begin-1),这不是比之前小了?

    2.1.2如果指针移动到了一个比柱子(begin)低的柱子上,此时面积area=新的短的柱子(begin)长度*(end-begin-1),这不是更小了?

    因此,移动高的那个柱子的指针,只会让面积变小!!!

  2.2如果移动矮(假设是begin)的柱子的指针

     2.2.1如果指针移动到了一个比柱子(end)高的柱子上,此时面积area=短的柱子(end)长度*(end-begin-1),面积可能变大

    2.2.2如果指针移动到了一个比柱子(end)低的柱子上,此时面积area=新的短的柱子(begin)长度*(end-begin-1),面积变小

    因此,选择移动矮的指针

 

 

#include <iostream>
#include <vector>
using  namespace std;

int maxArea(vector<int>& height) {
    int len=height.size();
    int area=0;
    int begin=0,end=len-1;
    while(begin<end)
    {
        int flag=height[begin]<height[end]?begin:end;//看begin和end哪个位置的数大
       area=area>(end-begin)*height[flag]?area:(end-begin)*height[flag];
        flag==begin?begin++:end--;
    }
    return area;
}

int main() {
    vector<int> height={1,8,6,2,5,4,8,3,7};
    std::cout <<maxArea(height)<< std::endl;
    return 0;
}

 

posted @ 2019-02-28 14:17  maitianpt  阅读(274)  评论(0编辑  收藏  举报