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.
- 题目大概可以看成在若干木板中选取两块,使得可以组成的木桶盛水最多。
- 盛水量计算为低木板的高度两木板的距离,即较小的纵坐标两个点横坐标只差
思路
首先我先到的最简单办法,就是从左到右依次遍历所有情况,代码如下:
class Solution {
public:
int maxArea(vector<int>& height) {
int max = 0;
int n = height.size();
for(int i=0;i<height.size();i++) {
for(int j = i+1;j<height.size();j++) {
if(min(height[i],height[j])*(j-i) >= max) {
max=min(height[i],height[j])*(j-i);
}
}
}
return max;
}
};
显然这个方法最后的结果是超时了,后来我重新思考决定盛水量的因素有木板高度和两木板距离。我可以先确保两木板距离最大,然后使得选取的模板尽量的高一点。
- 先选择最左和最右
- 哪边更低则向中间靠拢
class Solution {
public:
int maxArea(vector<int>& height) {
int maxArea = 0,max;
int n = height.size();
int left = 0,right = height.size()-1;
while(left<right) {
max = (right - left)*min(height[left],height[right]);
if(max>maxArea)
maxArea = max;
if(height[left]>height[right])
right--;
else
left++;
}
return maxArea;
}
};
成功!