11. 盛最多水的容器
给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。画 n 条垂直线,使得垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
注意:你不能倾斜容器,n 至少是2。
int maxArea(int* height, int heightSize) {
int max = 0;
int start = 0;
int end = heightSize - 1;
while(start < end){
if(height[start] >= height[end]){
int temp = height[end] * (end - start);
if(max < temp)
max = temp;
end--;
}
else{
int temp = height[start] * (end - start);
if(max < temp)
max = temp;
start++;
}
}
return max;
}
这题时间复杂度为O(n),主要是运用双指针的方法来实现一次遍历就获取到最大的储水量,通过判断start和end指向的元素的大小来判断下一步应该移动哪一个指针,首先容积的计算是取两个之间的最小值然后乘以间距,而间距缩小的时候只能通过增大最小的值的值才可能会有更大的值出现,因此在缩小间距的时候应该注意每次移动的指针应该是指向更小的那个元素的指针。