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.
题目解读:
有n个非负数,代表n个隔水板的高度,现在求两个隔水板之间最大的容水量,也就是找一对隔水板,距离*min(两个隔水板高度)的最大值。
解题思路:
方法一:穷举法 代码如下:
class Solution {
public:
int maxArea(vector<int>& height) {
int length=height.size();
if(length<=1) return 0;
int cap=0;
for(int i=0;i<length-1;i++)
{
for(int j=i+1;j<length;j++)
{
if(min(height[i],height[j])*(j-i)>cap)
cap=min(height[i],height[j])*(j-i);
}
}
return cap;
}
};
方法一直观简单,但是会有超时现象。
方法二:
先求距离最远的两个隔板的存水量,当距离减小,想要增加存水量的时候,隔板最小高度应该相应增加。利用这种思想,我们有下面代码:
class Solution {
public:
int maxArea(vector<int>& height) {
int length=height.size();
if(length<=1) return 0;
int cap=0;
int left=0,right=length-1;
while(left<right)
{
if(min(height[left],height[right])*(right-left)>cap)
cap=min(height[left],height[right])*(right-left);
if(height[left]<height[right])
left++;
else
right--;
}
return cap;
}
};