LeetCode 11. 盛最多水的容器

给你 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
思路:一种是暴力算法,双for遍历,还有一种是双指针,一个从左,一个从右,如果左边的柱子比右边的柱子短,左边向后移一位,反之亦然。代码如下:
 1 #define min(a,b) ((a>b)?(b):(a))
 2 int maxArea(int* height, int heightSize){
 3     int l=0,r;
 4     r=heightSize-1;
 5     int res=0,temp;
 6     while(l<r){
 7         temp=(r-l)*min(height[l],height[r]);
 8         res=res>temp?res:temp;
 9         if(height[l]>height[r]){
10             r--;
11         }else{
12             l++;
13         }
14     }
15     return res;
16 }

 

 
posted @ 2020-04-18 16:26  莴苣&  阅读(110)  评论(0编辑  收藏  举报