这道题其实不难,但是需要注意题目的要求,理解题目意思很重要! 首先我来说说题目意思吧,这道题是给你n个数,
存在vector中,每个数和其下标组成一个坐标(i,ai),要求其中两个点以及他们与x轴的垂线以及x轴三线组成的图形的能装
下多少水。注意,这不是求面积!,我画个图分析一下吧
我们要求的是矩形的面积,而不是梯形的面积,这和生活有一定联系吧,倾斜的水会洒出来的,所以我们需要求什么已经很清楚了,于是我们可以写出下面的代码:
class Solution {
public:
int maxArea(vector<int>& height) {
int num = height.size();
if(num < 2)
{
return 0;
}
int maxcontain = 0;
/*
从两边向中间逼近,设wid = end -begin , high = min(height[begin,end]) ,那么最大容量为contain = wid*high
要想contain最大,那么wid和high都要尽量的大才能保证,所以我决定采用从两边向中间逼近的方法去测试wid和high的
乘积的最大值,这样时间复杂度比较小,想一想两个for循环的写法,真的很低效。
*/
int begin =0;
int end = num-1;
while(begin < end)
{
int tmp = (end-begin)*min(height[begin],height[end]);
maxcontain = maxcontain > tmp ? maxcontain:tmp;
if(height[begin] >= height[end])
{
--end;
}
else
{
++begin;
}
}
return maxcontain;
}
};
以上的代码的思路在代码也说明了,大家应该能理解,这道题我们不能使用两个for循环去解题的,因为效率太低了O(n^2)。我们是从两边向中间去探索,这样底部的长度在不断减小,找到两个高度很高的值有可能就是答案,所以就是这样解题的。