题目
Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.
Note: You may not slant the container and n is at least 2.
分析给定一些数字和所在索引下标构成容器的两端,求最大容量的容器,首先需要考虑宽度最大,即第一个元素和最后一个元素构成的容器容积,根据短板原理,此刻的高度为二者中最小的,由于高度都是整数,因此如果向中间移动,当移动高度最小的那块时,如果相邻元素比最小的大,则构成的容积大于等于之前的容积(此时宽度减1,高度至少加1);如果相邻元素小于等于最小高度,则构成的容积必然小于之前的容积,所以接下来向中间移动,只从高度最小处向中间移动,一旦找到高度大于最小值的,就计算当前容积,判断是否比之前的大,保存最大值,同时继续移动最小的高度,直到相遇。
class Solution {
public:
int maxArea(vector<int>& height) {
int res=0;
int beg=0,end=height.size()-1;
while(beg<end){
int h=min(height[beg],height[end]);
res=max(res,(end-beg)*h);
while(height[beg]<=h&&beg<end)
++beg;
while(height[end]<=h&&beg<end)
--end;
}
return res;
}
};
参考文献:
Simple and fast C++/C with explanation
C++ O(n) solution with thought process applying simple bucket theory