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.
思路
好吧,这道题一开始看,根本感觉莫名其妙,我不是说题目,我是说返回值:上面明明说找到两条线,而返回值却是一个int值?无奈点击了DISCUSS,可是发现并没有人在讨论这个问题,然后我就很轻松的选中了题目,然后右击->用Google搜索 "Container With Most Water"。好吧,我最初的目的确实很简单,但是无奈虽然只扫了一眼Google第一条结果:
那个O(n)的方法深深的刻在了我的脑子里,还有那几个字“从两头到中间”。既然有O(n)的方法那就想想吧。想了十几分钟想出来了。就是两头各有一个指针,哪个指的数字小就把那个指针向内移动。这样可以找到最大的体积。既然这样,就立马写了,然后返回最大的体积,看看leetcode的返回值是不是这个意思,submit solution,竟然看到了accepted。好吧,就这样。
class Solution {
public:
int maxArea(vector<int> &height) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
int lc=0;
int rc=height.size()-1;
int max_area=0;
while(lc<rc)
{
int tmp_area=(rc-lc)*minint(height[lc],height[rc]);
if(tmp_area>max_area) max_area=tmp_area;
if(height[lc]<=height[rc])
lc++;
else
rc--;
}
return max_area;
}
inline int minint(int a,int b)
{
return a>b?b:a;
}
};