11ContainerWithMostWater

本文介绍了一种在给定高度的直立线条中找到能够容纳最多水量的两条线的算法。通过逐步缩小搜索范围,从两端开始向中间逼近,最终实现O(n)的时间复杂度。

题意:给定n个非负整数a1、a2,...,an,画n条竖线,满足第i条线的终点分别为(i,ai)和(i,0)。找出两条线,和x轴形成一个容器,满足装的水最多。

说明:不能倾斜容器。

思路:设选中的两条线分别为i,j(i < j),开口容器形成长方体,容纳的水量为(j-i)*Math.min(xi, xj).

1、穷举法,依次求面积找最大,运行超时,时间复杂度O(n^2)

2、找规律,距离逐渐减小,短边逐渐变大,求出面积最大值 时间复杂度O(n) 

    public static int maxArea(int[] height) {
    	if(height == null || height.length == 0)
    		return 0;
    	int left = 0, right = height.length - 1;
    	int max = 0, localArea;
    	while(left < right){
    		localArea = right - left;
    		if(height[left] <= height[right]){//短边决定面积,增大短边
    			localArea *= height[left];
    			left++; //减小间距
    			
    		} else{
    			localArea *= height[right];
    			right--;//减小间距
    		}
    		
    		if(localArea > max){
    			max = localArea;
    		}
    	}
    	return max;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值