LeetCode11. 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 and n is at least 2.

题目大致要求:

给了n个非负的整数,每一个整数代表一个点(i,ai)。总共有n条垂直的直线,每条直线的两个端点分别为(i,0)、(i,ai),找到两条直线和x轴构成一个容器,使得这个容器能够装最多的水.


分析:感觉遇到这种题目,正常的思路,二话不说,直接强算所有的每两两之间的直线的能够成所有容器的大小,但是这种暴力算法应该是行不通的,所以就需要一些小技巧。

比如说:

我自己画了一张图,我用left、right代表两个指针分别从左、右开始遍历数组


一开始left在1的下标处right在5的下标处,这这时候 maxArea=2*(5-1)=8;

我将left向右移动至2继续算出maxArea更新之后为12;

这时候因为right对应的高度小于5所以应该移动right,right=4;

maxArea还是12;继续移动right至3,maxArea还是12;

在移动right至2发现与left重合了,这样就结束了。

这题主要的关键是如何去移动指针,比如说我当前左指针在第i个位置,右指针在第j个位置,左指针对应的高度比右指针对应的高度要小,

那么应该将左指针往右移动,为什么呢?因为左指针是从左边移动过来的,它左边对应的高度肯定是和当前right或right右边的高度计算过才到达

left当前的位置的,当前left往右移动的时候,两指针宽度减小,移动完的左指针对应的高度未知,可能算出的面积比最大面积要大(只是可能),

如果是往左移动右指针的话你会发现它们之间的宽度肯定是减小的,而且右指针对应的新高度无论是比左指针高度高还是低,算出的面积怎么样都是小的。

所以,我认为这题目关键是往可能变大的方向移动,直至两指针相遇。

public int maxArea(int[] height) {
		int left=0,right=height.length-1;
		int maxArea=0;
		
		while(left<right)
		{
			maxArea=Math.max(maxArea,Math.min(height[left], height[right])
					*(right-left));
			if(height[left]<height[right])
				left++;
			else 
				right--;
		}
		return maxArea;
	}

希望能帮到大家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值