Leetcode 11.盛最多水的容器
题目大意
解题思路
O(n^2)的思路就不讲了,每种情况都试一次就完了。
这里着重讲下O(n)的方法,即前后两头往中间去扫描。
由于容量取决于二者之间更短的木板和二者相距的位置,所以我们从两头最远的位置来看,剩下的所有组合之间的距离都小于这个值,所以更大的容量依靠的是短的木板能够变长,而非二者之间的距离变远。
那么比较的时候就两种情况嘛:左 < 右,那么左指针往右移动一个位置,因为这时候去改变右边的高度是不会带来更好的结果的。假如右边往左靠近了,那么不管右边新的高度是高了还是低了,新的容量一定小于等于原来的容量,所以这么移动是没有意义的。
所以我们希望的是,左边的新高度能高一点以此来弥补距离上的减少,总的容量还能增加。
讲到这里,代码就很显然了。
代码
class Solution {
public:
int maxArea(vector<int>& height) {
int left = 0,right = height.size() - 1;
int vol = 0;
while(left < right){
int h = min(height[left],height[right]);
vol = max(vol, h * (right - left));
if(height[left] < height[right])
++left;
else
--right;
}
return vol;
}
};