参考:https://yq.aliyun.com/articles/889
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.
翻译:
给定n个非负整数a1,a2,
...
,an,其中每个代表一个点坐标(i,ai)。n个垂直线段例如线段的两个端点在(i,ai)和(i,
0
)。找到两个线段,与x轴形成一个容器,使其包含最多的水。备注:你不必倾倒容器。
常规的思路:
就是通过2个for循环直接暴力求解,但是在leetcode的测试用例中就会超时。
class Solution {
public:
int maxArea(vector<int>& height) {
int length = height.size();
int area = 0;
int tempArea = 0;
for (int i = 0; i < length-1; i++)
{
for (int j = i + 1; j < length; j++)
{
int h = height[i] < height[j] ? height[i] : height[j];
area = h*(j - i);
tempArea = tempArea>area ? tempArea : area;
}
}
return tempArea;
}
};
改进思路:
两边设一个指针,然后计算area,如果height[i] <= height[j],那么i++,因为在这里height[i]是瓶颈,j往里移只会减少面积,不会再增加area。
这是一个贪心的策略,每次取两边围栏最矮的一个推进,希望获取更多的水。
class Solution {
public:
int maxArea(vector<int>& height) {
int j = height.size()-1;
int i = 0;
int area = 0;
int tempArea = 0;
while (i < j)
{
if (height[i] <= height[j])
{
area = height[i] * (j - i);
i++;
}
else
{
area = height[j] * (j - i);
j--;
}
tempArea = tempArea > area ? tempArea : area;
}
return tempArea;
}
};
python实现代码:
class Solution(object):
def maxArea(self, height):
"""
:type height: List[int]
:rtype: int
"""
i=0
j=len(height)-1
area=0;
tempArea=0
while(i<j):
if(height[i]<=height[j]):
area = height[i] * (j - i)
i += 1
else:
area = height[j] * (j - i)
j -= 1
if tempArea < area:
tempArea = area
return tempArea
height=[1,2,1]
sol=Solution();
print sol.maxArea(height)