题目大意:
坐标轴上,有n个点,坐标分别是(1,a1)、(2,a2)...(n,an),其中,纵坐标均是非负整数。
从中选取两个坐标,使其与x轴形成一个盛水容器,求最大的盛水量,注意,斜面不能盛水。
大致思路:
刚开始,用的是暴力解法,分别取距离为1/2/3/4/5...n,然后取最大值,时间复杂度为O(n2),在测试集合比较大的情况下会超时。
后面,参考网上的方法,大致想法如下.
1.初始化:从两边的坐标开始,左边高度为LH,右边高度为RH,结果初始化res=0.
求得盛水量与res取较大值,赋予res.
2.循环:
若LH<RH,则将LH往右移动,直到碰到一个比原LH大的坐标,因为若比元LH小,同时和RH的距离也短,那么结果肯定比原LH和RH的结果小,可以过滤掉,
为什么是移动LH和RH较小者,原理同上,因为最小者是计算采用的值,类似于木桶的短板。
同理,若RH<LH,则将RH往左移动,直到找到比原RH大的值。
3,返回结果。
这种方法,时间复杂度降为O(n).
代码如下:
int min(int a,int b){
if(a<=b) return a;
else return b;
}
int maxArea(int* height, int heightSize) {
if(height<=1) return 0;
int i,j,temp;
int res=0;
for(i=0,j=heightSize-1;i
res) res=min(height[i],height[j])*(j-i);
if(height[i]<=height[j]){
temp=height[i];
i++;
while(height[i]<=temp&&i