地址:http://oj.leetcode.com/problems/container-with-most-water/
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.
思路:首先理解题意,任意两边加X轴,即left与right之间不考虑比left和right都小的。o(n^2)方法会TLE。考虑从两边向中间搜索,两边中较小一边先搜(前进或后退),o(n)时间
参考代码:
class Solution {
public:
int maxArea(vector<int> &height) {
int res = 0;
if(!height.empty())
{
int left = 0, right = height.size()-1;
while(left < right)
{
res = max(res, (right - left)*min(height[left], height[right]));
if(height[left]<height[right])
++left;
else
--right;
}
}
return res;
}
};
python version:
# @return an integer
def maxArea(self, height):
i = ans = 0
j = len(height)-1
while i < j:
if ans < min(height[i], height[j]) * (j-i):
ans = min(height[i], height[j]) * (j-i)
if height[i] <= height[j]:
i+=1
else:
j-=1
return ans
SECOND TRIAL
正确性可用反证法证明
class Solution {
public:
int maxArea(vector<int> &height) {
int ans = 0, i = 0, j = height.size()-1;
while(i<j)
{
ans = max(ans, min(height[i], height[j])*(j-i));
if(height[i]<height[j])
++i;
else
--j;
}
return ans;
}
};