LeetCode_11---Container With Most Water

Given n non-negative integers a1a2, ..., an, where each represents a point at coordinate (iai). n vertical lines are drawn such that the two endpoints of line i is at (iai) 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轴上在1,2,...,n点上有许多垂直的线段,长度依次是a1a2, ..., an。找出两条线段,使他们和x抽围成的面积最大。面积公式是 Min(ai, aj) X |j - i|

    Code:

    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * 
     */
    
    /**
     * @author MohnSnow
     * @time 2015年6月2日 下午5:24:20
     * 
     */
    public class LeetCode11 {
    
    	/**
    	 * @param argsmengdx
    	 *            -fnst
    	 */
    	//梯形面积=(上底+下底)*高/2
    	//Max = (aj+ai)*(j-i)/2
    	//Time Limit Exceeded---->可见这个空间复杂度有点高,可以尝试利用空间复杂度取代时间复杂度
    	//一开始没看懂题目,以为是一个梯形了
    	public static int maxArea(int[] height) {
    		int len = height.length;
    		//System.out.println("maxArea: len:" + len);
    		int max = 0;
    		int temp = 0;
    		int i = 0, j = 0;
    		for (; i < len; i++) {
    			for (j = i + 1; j < len; j++) {
    				temp = (Math.min(height[i], height[j])) * (j - i);
    				if (max < temp) {
    					//System.out.println("maxArea: i:" + i + " j:" + j);
    					max = temp;
    				}
    			}
    		}
    		return max;
    	}
    
    	//直观的解释是:容积即面积,它受长和高的影响,当长度减小时候,高必须增长才有可能提升面积
    	//所以我们从长度最长时开始递减,然后寻找更高的线来更新候补;
    	//还是从两头向中间靠拢的解法
    	public static int maxArea1(int[] height) {
    		int len = height.length;
    		int max = 0;
    		int i = 0, j = len - 1;
    		while (i < j) {
    			max = Math.max(Math.min(height[i], height[j]) * (j - i), max);
    			if (height[i] < height[j]) {
    				int m = i + 1;
    				while (m < j && height[m] < height[i]) {
    					m++;
    				}
    				i = m;
    			} else {
    				int m = j - 1;
    				while (m > i && height[m] < height[j]) {
    					m--;
    				}
    				j = m;
    			}
    		}
    		System.out.println("maxArea1: i:" + i + " j:" + j);
    		return max;
    	}
    
    	public static int maxArea2(int[] height) {
    		int i = 0, j = height.length - 1;
    		int max = 0;
    		while (i < j) {
    			max = Math.max(Math.min(height[i], height[j]) * (j - i), max);
    			if (height[i] < height[j]) {
    				i++;
    			} else {
    				j--;
    			}
    		}
    		return max;
    	}
    
    	/**
    	 * @param i
    	 * @param j
    	 * @returnmengdx-fnst
    	 */
    	public static void main(String[] args) {
    		//int[] test = { 1, 2, 3, 4, 8, 9, 6, 5, 4, 9, 6, 23, 48, 5, 6, 56, 5, 46, 6 };
    		int[] test = { 1, 2, 5, 4 };
    		System.out.println(maxArea(test));
    		System.out.println(maxArea1(test));
    		System.out.println(maxArea2(test));
    	}
    
    }
    


    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值