Container With Most Water

<pre name="code" class="java">
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.
 

z首先题目的意思是

以数组的点height[index]为y轴坐标,数组的位置index为x轴坐标。连接(index,0)与(index,height[index])两点形成一条直线。

在所有的直线中找出两条直线,使这两条直线与x轴围成个|_|的形状容器,求所有容器中最大面积。


这道题想了很久都没想到答案。后来看别人的答案才自己写出来的。


问题的解法是双指针。双指针在前面的3sum问题中也用到过。自己概括地说,双指针能够把你O(n^2)降为O(n)。就是通过比较头尾两个指针,然后来移动其中一个就行了。


这道题也是这样的解法。

首先两个指针一头start,一尾end。可以求得最大面积。

如果height[start]>height[end],那么需要end-=1;因为面积是取决于最小的那一条边,因此我们希望通过移动end能够获得更大的边,并且来比较是否会超过当前的最大值。

相反,如果height[start]<=height[end];then start+=1;

maxresult=maxresult>Math.min(height[start],heigth[end])*(end-height)?maxresult:Math.min(height[start],heigth[end])*(end-height)

所以代码如下。本文就是要理解双指针的妙处。

public class Container_With_Most_Water {
	public int maxArea(int[] height) {
        int maxresult=-1;
        int start=0,end=height.length-1;
        while(start<end){
        	if(height[start]>height[end]){
        		maxresult=maxresult>height[end]*(end-start)?maxresult:height[end]*(end-start);
        		end--;
        	}
        	else{
        		maxresult=maxresult>height[start]*(end-start)?maxresult:height[start]*(end-start);
        		start++;
        	}
        }
        return maxresult;
    }
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值