LeetCode 11. 盛最多水的容器
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
思路:一种是暴力算法,双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 }