问题描述:给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器。
示例 1:
输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
解析:双指针问题,上一道题求最高频数也可以看成双指针问题。
注意:这里的指针不是指形式,而是指意义。
两个指针i,j,j指向第一个,i指向最后一个。求此时的面积,然后移动指针。因为此题求的是最大面积,所以要移动高度较小的指针。移小的之后面积一定会大于移大的之后的面积。直到两个指针相遇,找到所求面积的最大值即可。(每次保存最大面积)
注: 这个做法虽然没有求得所以情况下的面积,是因为省略计算了一些比现有面积还小的(只移动高度较小的指针的时候,便是省略计算了比现有面积还小的情况,这样对最终结果并无影响)
Java:
class Solution {
public int maxArea(int[] height) {
int j=0,i=height.length-1,m=0;//一开始时这里的j没有-1,导致下边数组越界,提交时出现错误,这种小细节应该注意
int s,max=0;
while(i!=j){
int h=Math.min(height[i],height[j]);
s=h*(i-j);
if(s>max) max=s;
if(h==height[j]) j++;
else i--;
}
return max;
}
}
c++:
class Solution {
public:
int maxArea(vector<int>& height) {
int j=0,i=height.size()-1;
int max=0,s,h;
while(i!=j){
h=min(height[i],height[j]);
s=h*(i-j);
if(s>max) max=s;
if(h==height[j]) j++;
else i--;
}
return max;
}
};